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: 初始值是数组的第一个元素,找到第一个正数后,再给sum赋初值,然后指针向后移,保证sum的和大于0
maxsum: 存放最大的子数组和,初值先赋值为第一个元素值
首先找到第一个正数,在找正数的过程中,将最大的复数赋值给maxsum,这样就可以保证数组全负时,maxsum仍然是最大值。
如果找到了正数,则先将第一个正数的值赋值给sum,每次加上一个正的数组元素时,都对sum和maxsum进行判断,保存最大值,如果加上了一个负的数组元素,但sum还是为正数,就直接将数组元素累计在sum中,如果加上负的数组元素后,sum小于等于0,先sum和maxsum的值进行判断,保存最大的值,然后指针再向后移,判断出现的第一个正数,并和maxsum比较,以防后面的元素拉低了第一个出现正数的值。
public class Solution {
public int maxSubArray(int[] nums) {
int lastpos;
int sum=nums[0],maxsum=nums[0];
int i=0;
while(i<nums.length){
if(nums[i]<=0){
if(nums[i]>maxsum){
maxsum=nums[i]; //记录下最大的非正数数值
}
i++;
}else{
sum = nums[i];
maxsum=maxsum>sum?maxsum:sum;
break; //找到了第一个正数
}
}
if(i<nums.length){ //说明数组中有正数
i++;
while(i<nums.length){
if(sum+nums[i]>0 && nums[i]<=0){
sum =sum + nums[i];
i++;
}else if(nums[i]>0){
sum =sum + nums[i];
maxsum=maxsum>sum?maxsum:sum;
i++;
}else{
maxsum=maxsum>sum?maxsum:sum;
i++;
while(i<nums.length && nums[i]<=0){ //找到第一个正数
i++;
}
if(i>=nums.length){
return maxsum;
}else{
sum=nums[i];
maxsum=maxsum>sum?maxsum:sum;
i++;
}
}
}
}
// maxsum=maxsum>sum?maxsum:sum;
return maxsum;
}
}
方法二:
解题思路:
sum:从下标0开始累加元素的和,每累加一个元素,就和max比较一下。(先和max比较,因为max也有可能是负数,如果先判断sum是否小于等于0,这时sum的值已经改变了)。然后再看sum是否小于等于0,(当所有元素为负数时,每个元素都和max进行了比较),如果是,则表示前面这段累加没有作用,舍弃了前面的元素的累加结果为0的情况,重新开始累积。
max:存放最大子数组的和
class Solution {
public int maxSubArray(int[] nums) {
int max = nums[0];
int sum = 0;
int len = nums.length;
for(int i = 0; i<len;i++){
sum += nums[i];
if(sum > max){
max = sum;
}
if(sum <=0){
sum = 0;
}
}
return max;
}
}
确定最大子数组的起始点下标:
class Solution {
public int maxSubArray(int[] nums) {
int max = nums[0];
int maxleft = 0, maxright = 0;
int sum = 0;
int left = 0, right = 0;
int len = nums.length;
for(int i = 0; i<len;i++){
sum += nums[i];
if(sum > max){
max = sum;
maxleft=left;
maxright = right;
}
if(sum <=0){
sum = 0;
left=i+1;
right=i+1;
}else{
right+=1;
}
}
return max;
}
}