Lintcode 41. 最大子数组

描述:给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。

个人思路:通过观察可以知道,要想和最大,那么这个子数组的开头元素和结尾元素必须是个非负数,因此采取的贪心策略是,先索引到数组的第一个非负数,然后开始累加,当累加的索引指向另外一个非负数时,就比较之前的和加上该数大,还是该数本来就大,然后再对前一步的结果和之前记录的最大两者取最大

(PS:请忽视我混乱的代码)

 public int maxSubArray(int[] nums) {
        int start = 0;
        int sum2 = nums[start];
        while(start < nums.length && nums[start] < 0) {
            if(sum2 <= nums[start])
                sum2 = nums[start];
            start++;
        }

        if (start == nums.length)
            return sum2;

        int maxSum = nums[start];
        int sum = maxSum;
        for (int i = start+1; i < nums.length; i++) {
            if (nums[i] >= 0){
                maxSum = (maxSum + nums[i] > nums[i]) ? (maxSum + nums[i]) : nums[i];
                sum = Integer.max(maxSum, sum);
            }else{
                maxSum += nums[i];
            }
        }

        return sum;
    }

dalao思路:采取的贪心策略是不管怎样,先把遍历到的数加起来,如果目前的结果和为负,那前面累加的数就没有意义,将变量置为0,重新开始累加。即贪心策略为不符合的,直接丢掉

// write your code here
        int i;
        int elemSum = 0;     //数组元素逐个求和
        int maxSum = nums[0];     //记录连续求和最大值(初始值)

        for (i = 0; i < nums.length; i++) {

            elemSum += nums[i];

            //顺序累加求和,记录最大值
            if (elemSum > maxSum && elemSum > 0) {      //初始值为负时,elemSum大于0判定
                maxSum = elemSum;
            }

            //和为零时,从下一个元素重新累加
            if (elemSum < 0) {
                elemSum = 0;
            }
        }
        return maxSum;

summary:与AssignCookie1230 不同,那题求的是个数最多,这题求的是累积和最多

猜你喜欢

转载自blog.csdn.net/qq_38702697/article/details/82761490