您的位置:首页 > 其它

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

2015-04-11 09:33 260 查看
要求:

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

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

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

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

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

具体代码如下:

public static void main(String[] args){
int numberLength = 10;
int a[] = new int[numberLength];
for(int i = 0;i < numberLength;i++){
a[i] = (int)(Math.random() * 20 - 10);   // 产生的随机数范围在-9 ~ 9
}
System.out.print("产生的随机数的值为:");
for(int i = 0;i < numberLength;i++){
System.out.print(a[i] + " ");
}
System.out.print("\n");

int sum = a[0],temp = 0,left = 0,right = 1,i = -1,r = -1;
while(1!=0){
i++;
r = i % numberLength;
temp = temp + a[r];
if(temp < a[r]){
temp = a[r];
left = i;
}
if(temp >= sum){
sum = temp;
right = i;
}
// 如果循环两圈以上,或者将所有的数全部加上,则跳出。
if(i/numberLength > 2 || Math.abs(i - left)== numberLength){
break;
}
}

System.out.println("最大字数组的和为:" + sum);
System.out.println("边界为:" + ((left%numberLength)+1) + " 到  " + ((right%numberLength)+1));
}


个人总结:在while循环的跳出时,需考虑周全。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐