2021.09.28 - 096.最大子序和

1. 题目

在这里插入图片描述

2. 思路

(1) 动态规划

  • 遍历数组,计算每个以元素i为结尾的子区间的最大和,记录最大值返回。
  • 每个以元素i为结尾的子区间的最大和,要么是以元素i-1为结尾的子区间的最大和加上元素i的值,要么就是元素i的值。

(2) 分治法

  • 没看懂。

3. 代码

public class Test {
    
    
    public static void main(String[] args) {
    
    
    }
}

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

class Solution1 {
    
    
    class Status {
    
    
        public int lSum, rSum, mSum, iSum;

        public Status(int lSum, int rSum, int mSum, int iSum) {
    
    
            this.lSum = lSum;
            this.rSum = rSum;
            this.mSum = mSum;
            this.iSum = iSum;
        }
    }

    public int maxSubArray(int[] nums) {
    
    
        return getInfo(nums, 0, nums.length - 1).mSum;
    }

    public Status getInfo(int[] a, int l, int r) {
    
    
        if (l == r) {
    
    
            return new Status(a[l], a[l], a[l], a[l]);
        }
        int m = (l + r) >> 1;
        Status lSub = getInfo(a, l, m);
        Status rSub = getInfo(a, m + 1, r);
        return pushUp(lSub, rSub);
    }

    public Status pushUp(Status l, Status r) {
    
    
        int iSum = l.iSum + r.iSum;
        int lSum = Math.max(l.lSum, l.iSum + r.lSum);
        int rSum = Math.max(r.rSum, r.iSum + l.rSum);
        int mSum = Math.max(Math.max(l.mSum, r.mSum), l.rSum + r.lSum);
        return new Status(lSum, rSum, mSum, iSum);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44021223/article/details/120528843