一、题目:
返回一个整数数组中最大子数组的和。
要求:
1.输入一个整形数组,数组里有正数也有负数。
2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3.求所有子数组的和的最大值。要求时间复杂度为O(n)。
二、设计思路
1.定义一个大小为10的数组,接受任意十个自然正数;
2.分别将连续的一个数,两个数,......,组合成子数组,分别求出包含一个元素的数组的最大值,两个元素的,三个元素的,......,然后再比较这十组的值,求出最大值,即为所求;
3.单独判断一些特殊的容易计算的情况,比如全是负数、全是正数、只有一个正数。这样能有效地提高程序的效率。;
三、源代码
1 import java.util.*; 2 3 class SuperMax 4 { 5 public static void main(String[] args) 6 { 7 Scanner sc=new Scanner(System.in); 8 9 int[] list = new int[10];//输入数组是必须先定义数组,否则出错! 10 int[] arr1 = new int[9];//输入数组是必须先定义数组,否则出错! 11 int[] arr2 = new int[8];//输入数组是必须先定义数组,否则出错! 12 int[] arr3 = new int[7];//输入数组是必须先定义数组,否则出错! 13 int[] arr4 = new int[6];//输入数组是必须先定义数组,否则出错! 14 int[] arr5 = new int[5];//输入数组是必须先定义数组,否则出错! 15 int[] arr6 = new int[4];//输入数组是必须先定义数组,否则出错! 16 int[] arr7 = new int[3];//输入数组是必须先定义数组,否则出错! 17 int[] arr8 = new int[2];//输入数组是必须先定义数组,否则出错! 18 int[] ma = new int[10];//输入数组是必须先定义数组,否则出错! 19 20 int i=0,sum = 0; 21 System.out.println("请输入数组:"); 22 for(int k=0;k<10;k++) 23 { 24 list[k]=sc.nextInt(); 25 } 26 int max=list[0]; 27 28 for(i=0;i<10;i++) 29 { 30 if(list[i]>max) 31 { 32 max=list[i]; 33 } 34 35 } 36 ma[0] = max; 37 System.out.println("有1个元素最大子数组的和为"+ma[0]); 38 for(i=0;i<9;i++) 39 { 40 arr1[i] = list[i]+list[i+1]; 41 } 42 int max1=arr1[0]; 43 for(i=0;i<9;i++) 44 { 45 if(arr1[i]>max1) 46 { 47 max1=arr1[i]; 48 } 49 50 } 51 ma[1]=max1; 52 System.out.println("有2个元素最大子数组的和为"+ma[1]); 53 for(i=0;i<8;i++) 54 { 55 arr2[i] = list[i]+list[i+1]+list[i+2]; 56 } 57 int max2=arr2[0]; 58 for(i=0;i<8;i++) 59 { 60 if(arr2[i]>max2) 61 { 62 max2=arr2[i]; 63 } 64 65 } 66 ma[2]=max2; 67 System.out.println("有3个元素最大子数组的和为"+ma[2]); 68 for(i=0;i<7;i++) 69 { 70 arr3[i] = list[i]+list[i+1]+list[i+2]+list[i+3]; 71 72 } 73 int max3=arr3[0]; 74 for(i=0;i<7;i++) 75 { 76 if(arr3[i]>max3) 77 { 78 max3=arr3[i]; 79 } 80 81 } 82 ma[3] = max3; 83 System.out.println("有4个元素最大子数组的和为"+ma[3]); 84 for(i=0;i<6;i++) 85 { 86 arr4[i] = list[i]+list[i+1]+list[i+2]+list[i+3]+list[i+4]; 87 } 88 int max4=arr4[0]; 89 for(i=0;i<6;i++) 90 { 91 if(arr4[i]>max4) 92 { 93 max4=arr4[i]; 94 } 95 96 } 97 ma[4] = max4; 98 System.out.println("有5个元素最大子数组的和为"+ma[4]); 99 for(i=0;i<5;i++)100 {101 arr5[i] = list[i]+list[i+1]+list[i+2]+list[i+3]+list[i+4]+list[i+5];102 }103 int max5=arr5[0];104 for(i=0;i<5;i++)105 {106 if(arr5[i]>max5)107 {108 max5=arr5[i];109 }110 111 }112 ma[5] = max5;113 System.out.println("有6个元素最大子数组的和为"+ma[5]);114 for(i=0;i<4;i++)115 {116 arr6[i] = list[i]+list[i+1]+list[i+2]+list[i+3]+list[i+4]+list[i+5]+list[i+6];117 }118 int max6=arr6[0];119 for(i=0;i<4;i++)120 {121 if(arr6[i]>max6)122 {123 max6=arr6[i];124 }125 126 }127 ma[6] = max6;128 System.out.println("有7个元素最大子数组的和为"+ma[6]);129 for(i=0;i<3;i++)130 {131 arr7[i] = list[i]+list[i+1]+list[i+2]+list[i+3]+list[i+4]+list[i+5]+list[i+6]+list[i+7];132 }133 int max7=arr7[0];134 for(i=0;i<3;i++)135 {136 if(arr7[i]>max7)137 {138 max7=arr7[i];139 }140 141 }142 ma[7] = max7;143 System.out.println("有8个元素最大子数组的和为"+ma[7]);144 for(i=0;i<2;i++)145 {146 arr8[i] = list[i]+list[i+1]+list[i+2]+list[i+3]+list[i+4]+list[i+5]+list[i+6]+list[i+7]+list[i+8];147 }148 int max8=arr7[0];149 for(i=0;i<2;i++)150 {151 if(arr8[i]>max8)152 {153 max8=arr8[i];154 }155 156 }157 ma[8] = max8;158 System.out.println("有9个元素最大子数组的和为"+ma[8]);159 for(i=0;i<10;i++)160 {161 sum = sum+list[i];162 }163 ma[9] = sum;164 System.out.println("有10个元素最大子数组的和为"+ma[9]);165 166 int max9=ma[0];167 for(i=0;i<10;i++)168 {169 if(ma[i]>max9)170 {171 max9=ma[i];172 }173 174 }175 System.out.println("最大子数组的和为"+max9);176 }177 178 }
四、结果截图
(既有正数又有负数)
(全正数)
(全负数)
五、心得体会
在这次实验中,尝试和同学组队做实验,感觉还不错。好处是可以互相能借鉴对方的想法和思路, 自己不注意的地方可能对方就注意到了,也能提高效率,但是缺陷就是每个人都有自己的思路,这样会在写代码的过程中比较耽搁时间, 但是总体来说,还是效率比较高的,在以后的练习中还应该多加练习组队练习,毕竟在今后的工作中还是以团队为整体工作, 经常的练习还是会有很好的提高的。六、工作照(成员:杨广鑫,郭健豪)