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.

 这道题就是求最大子串和

肯定是o(n)的时间和o(1)的空间

就是每次相加,  1、先判断是否全是非正数,如果是,那么直接返回最大的那个数。

         2、然后每次加一个数,就这样依次加下去,如果nums[j]大于0,那么与result相比取大的。

         2、如果此时的和小于0,那么舍去,并且将i置于此时j的下一位。

public class Solution {
    public int maxSubArray(int[] nums) {
        
		if( nums.length == 1)
			return nums[0];
        int result = nums[0],ans = nums[0];
        int i = 0,j = 1;
        for( int k = 0;k<nums.length;k++ ){
        	if( result < nums[k])
        		result = nums[k];
        }
        if( result <= 0 )
        	return result;
        while( i<nums.length && j < nums.length ){
            if( nums[i] < 0 ){
                while( i<nums.length && nums[i]<0 )
                    i++;
                if( i<nums.length )
                    ans = nums[i];
                j = i+1;
            }
        	else if( nums[j] >= 0 ){
        		ans+=nums[j];
        		j++;
        		result = result>ans?result:ans;	
        	}else{
        		if( ans+nums[j] <= 0 ){
        			i = j+1;
        			j = j+2;
        			if( i<nums.length )
        			    ans = nums[i];
        		}else{
        			ans+=nums[j];
        			j++;
        		}
        	}
        	
        }        
        return result;
    
    }
}

 然后发现是在写的是啰嗦。其实如下就可以

public class Solution {
    public int maxSubArray(int[] nums) {
        int max=nums[0];
        for(int i=1;i<nums.length;++i){
            nums[i]=nums[i-1]<0 ? nums[i] : nums[i-1]+nums[i];
            max = Math.max(max, nums[i]);
        }
        return max;
    }
}

 

public class Solution {
    public int maxSubArray(int[] nums) {
		if (nums.length == 1)
			return nums[0];
		int preSum = nums[0];
		int max = nums[0];
		for (int i = 1; i < nums.length; i++) {
			if (preSum <= 0)
				preSum = nums[i];
			else {
				preSum += nums[i];
			}
			if (preSum > max)
				max = preSum;
		}
		return max;
	}
}