返回一个整数数组中最大子数组的和3

要求:

• 输入一个整形数组,数组里有正数也有负数。

• 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

• 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。

• 同时返回最大子数组的位置。 求所有子数组的和的最大值。要求时间复杂度为O(n)。

设计思路:核心算法同求一个最大子数组的和Ⅱ相同,将所有数组一遍循环改为无限循环,只需选一个时间跳出即可。

具体代码如下:

 1     public static void main(String[] args){
 2         int numberLength = 10;
 3         int a[] = new int[numberLength];
 4         for(int i = 0;i < numberLength;i++){
 5             a[i] = (int)(Math.random() * 20 - 10);   // 产生的随机数范围在-9 ~ 9
 6         }
 7         System.out.print("产生的随机数的值为:");
 8         for(int i = 0;i < numberLength;i++){
 9             System.out.print(a[i] + " ");
10         }
11         System.out.print("
");
12         
13         int sum = a[0],temp = 0,left = 0,right = 1,i = -1,r = -1;
14         while(1!=0){
15             i++;
16             r = i % numberLength;
17             temp = temp + a[r];
18             if(temp < a[r]){
19                 temp = a[r];
20                 left = i;
21             }
22             if(temp >= sum){
23                 sum = temp;
24                 right = i;
25             }
26             // 如果循环两圈以上,或者将所有的数全部加上,则跳出。
27             if(i/numberLength > 2 || Math.abs(i - left)== numberLength){
28                 break;
29             }
30         }
31         
32         System.out.println("最大字数组的和为:" + sum);
33         System.out.println("边界为:" + ((left%numberLength)+1) + " 到  " + ((right%numberLength)+1));
34     }

个人总结:在while循环的跳出时,需考虑周全。

原文地址:https://www.cnblogs.com/jj352095583/p/4416850.html