LeetCode 53. Maximum Subarray

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;
    }
}


你可能感兴趣的:(LeetCode 53. Maximum Subarray)