Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [−2,1,−3,4,−1,2,1,−5,4]
,
the contiguous subarray [4,−1,2,1]
has the largest sum = 6
.
维护了两个值,sum和sum1,其中sum表示前i-1个数组元素的最大连续子数组的和;
sum1表示当前以a[i-1]为结束元素的连续子数组的和。这两个值都是初始化为数组中的第一个元素。
然后从第二个元素,也就是i=1开始遍历数组,如果sum1>0则a[i]成为sum1中最后一个元素sum1 = sum1+nums[i];
否则a[i]成为sum1中唯一的元素sum1= nums[i];
最后取sum和sum1中较大者为sum.
/*
* 维护了两个值,sum和sum1,其中sum表示前i-1个数组元素的最大连续子数组的和;
* sum1表示当前以a[i-1]为结束元素的连续子数组的和。这两个值都是初始化为数组中的第一个元素。
* 然后从第二个元素,也就是i=1开始遍历数组,如果sum1>0则a[i]成为sum1中最后一个元素sum1 = sum1+nums[i];
* 否则a[i]成为sum1中唯一的元素sum1= nums[i];
* 最后取sum和sum1中较大者为sum
*/
public int maxSubArray(int[] nums) {
int len = nums.length;
if(len == 0){
return 0;
}
int sum = nums[0];//sum表示前i-1个数组元素的最大连续子数组的和
int sum1 = nums[0];//sum1表示当前以a[i-1]为结束元素的连续子数组的和
for(int i=1;i<len;i++){
if(sum1>0){//sum1>0则a[i]成为sum1中最后一个元素
sum1 = sum1+nums[i];
}else{//否则,a[i]成为sum1中唯一的元素
sum1= nums[i];
}
if(sum < sum1){
sum = sum1;
}
}
return sum;
}
进一步分析可加上list1与sum1对应的连续子数组,list与sum对应的连续子数组。在最后得到的list即为求得sum对应的连续子数组。
/**
* 维护了两个值,sum和sum1,其中sum表示前i-1个数组元素的最大连续子数组的和;
* sum1表示当前以a[i-1]为结束元素的连续子数组的和。这两个值都是初始化为数组中的第一个元素。
* 然后从第二个元素,也就是i=1开始遍历数组,如果sum1>0则a[i]成为sum1中最后一个元素sum1 = sum1+nums[i];
* 否则a[i]成为sum1中唯一的元素sum1= nums[i];
* 最后取sum和sum1中较大者为sum.
* list1与sum1对应的连续子数组,list与sum对应的连续子数组。
*/
public int maxSubArray(int[] nums) {
/*保存的是最终的连续子数组,与sum对应*/
ArrayList<Integer> list = new ArrayList<Integer>();
/*保存的是临时的连续子数组,与sum1对应*/
ArrayList<Integer> list1 = new ArrayList<Integer>();
int len = nums.length;
if(len == 0){
return 0;
}
int sum = nums[0];//sum表示前i-1个数组元素的最大连续子数组的和
int sum1 = nums[0];//sum1表示当前以a[i-1]为结束元素的连续子数组的和
list.add(nums[0]);
list1.add(nums[0]);
for(int i=1;i<len;i++){
if(sum1>0){//sum1>0则a[i]成为sum1中最后一个元素
sum1 = sum1+nums[i];
list1.add(nums[i]);
}else{//否则,a[i]成为sum1中唯一的元素
sum1= nums[i];
list1.clear();
list1.add(nums[i]);
}
if(sum < sum1){
sum = sum1;
list.clear();
list.addAll(list1);
}
}
System.out.println("最后求得的连续子数组sum和为 "+sum);
System.out.println("最后求得的连续子数组list为 "+list);
return sum;
}
public static void main(String[] args){
MaxSubArray test = new MaxSubArray();
int nums1[] = {1,-2,3,10,-4,7,2,-5};
test.maxSubArray(nums1);
System.out.println("***********************");
int nums2[] = {-2,1,-3,4,-1,2,1,-5,4};
test.maxSubArray(nums2);
}