您的位置:首页 > 其它

LeetCode 53. Maximum Subarray

2017-05-30 00:02 405 查看
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;
    }
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: