53. Maximum Subarray【leetcode】

53. Maximum Subarray【leetcode】

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.

挑选子串中最大的值,自己写了一堆代码最后缺少负数情况的考虑,

public class Solution {
    public int maxSubArray(int[] nums) {
        //第一次找一个数组 记录所有大于0的数字的位置
        //结果=第一个非负数
        //逐次循环加到下一个非负数,如果比当前结果大,则替换当前结果
        int resMax=nums[0];
        int res =nums[0] ;
        int len = nums.length;
        int vaNums[] = new int [len];
        int j=0;
       // Map<Integer,Integer> map =new HaspMap<Integer,Integer>();
        int m=0;
        int plusNums[] = new int [len];
        for(int i=0;i<len;i++){
            if(nums[i]>0){
                vaNums[j]=i;
               // map.put(i,nums[i]);
                j++;
            }
            else{
                plusNums[m]=i;
                 m++;
            }
            res+=nums[i];
        }
        if(j>0){
     
            for(int k=0;k<j;k++){
                res =0;
                for(int l =vaNums[k];l<=vaNums[j-1];l++){
                    res+=nums[l];
                    if(resMax<res){
                        resMax=res;
                    }
                }

            }
        }//if j >0 end
        else {
            for(int k=0;k<m;k++){
                res =nums[0];
                for(int l =vaNums[k];l<plusNums[m-1];l++){
                    res+=nums[l];
                    if(resMax<res){
                        resMax=res;
                    }
                }

            }
        }
            
        
        return resMax;
    }
}

最佳办法,感觉是真滴牛逼

public class Solution {
    public int maxSubArray(int[] nums) {
        //第一次找一个数组 记录所有大于0的数字的位置
        //结果=第一个非负数
        //逐次循环加到下一个非负数,如果比当前结果大,则替换当前结果
        int sum=0,max=Integer.MIN_VALUE;
        int len =nums.length;
        for(int i=0;i<len;i++){
            sum +=nums[i];
            max =Math.max(sum,max);
            sum = Math.max(0,sum);
        }
//方法二

      /*
        int sum=0,max=Integer.MIN_VALUE,minSum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            max = Math.max(max, sum - minSum);
            minSum = Math.min(minSum, sum);
        }
    */
        
        return max;
    }
}
不积跬步无以至千里,千里之堤毁于蚁穴。 你是点滴积累成就你,你的丝丝懒惰毁掉你。 与诸君共勉
原文地址:https://www.cnblogs.com/haoHaoStudyShare/p/7337952.html