要求:
• 输入一个整形数组,数组里有正数也有负数。
• 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
• 如果数组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("\n"); 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循环的跳出时,需考虑周全。
原文:http://www.cnblogs.com/jj352095583/p/4416850.html