一、题目:
返回一个整数数组中最大子数组的和。
要求:
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 }
四、结果截图
(既有正数又有负数)
(全正数)
(全负数)
五、心得体会
在这次实验中,尝试和同学组队做实验,感觉还不错。好处是可以互相能借鉴对方的想法和思路,
自己不注意的地方可能对方就注意到了,也能提高效率,但是缺陷就是每个人都有自己的思路,这样会在写代码的过程中比较耽搁时间,
但是总体来说,还是效率比较高的,在以后的练习中还应该多加练习组队练习,毕竟在今后的工作中还是以团队为整体工作,
经常的练习还是会有很好的提高的。
六、工作照(成员:杨广鑫,郭健豪)