第一种算法(很麻烦)
设计思想:
1.通过随机数产生十个数。
2.声明一些变量,包括:
flag —— 用来控制子数组的长度,从一到十递增。
sum —— 记录最大子数组的和,初始值为a[0]。
s_temp —— 记录不断更新的子数组的和。
3.通过一个while语句和两个for循环实现。需注意第二个for循环中,为防止数组越界,使用Math.min方法。
源代码:
int a[] = new int[10];
for(int i = 0;i < 10;i++){
a[i] = (int)(Math.random() * 20 - 10); // 产生的随机数范围在-9 ~ 9
}
System.out.print("产生的随机数的值为:");
for(int i = 0;i <10;i++){
System.out.print(a[i] + " ");
}
System.out.print("\n");
int sum = a[0],s_temp = 0,flag = 1;
while(flag < 10){
for(int j = 0;j < 10;j++){
s_temp = 0;
for(int k = j;k < Math.min(j+flag,10);k++){
s_temp = s_temp + a[k];
}
if(s_temp > sum){
sum = s_temp;
}
}
flag++;
}
System.out.println("最大子数组的和为:" + sum);
}
运行结果:
第二种方法:
当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。所以,当接下来的和使现在的和更小时,抛弃它。当目前的和大于最大值,更新最大值。
1 int a[] = new int[10];
2 for(int i = 0;i < 10;i++){
3 a[i] = (int)(Math.random() * 20 - 10); // 产生的随机数范围在-9 ~ 9
4 }
5 System.out.print("产生的随机数的值为:");
6 for(int i = 0;i <10;i++){
7 System.out.print(a[i] + " ");
8 }
9 System.out.print("\n");
10 int sum = a[0],s_temp = a[0];
11 for(int i = 1 ;i < 10;i++){
12 s_temp = s_temp + a[i];
13 if(s_temp < a[i]){
14 s_temp = a[i];16 }
17 if(s_temp > sum){
18 sum = s_temp;21 }
22 }
23
24 System.out.println("最大子数组的和为:" + sum);