题目链接:https://leetcode.cn/problems/maximum-subarray/description/?envType=study-plan-v2&envId=top-100-liked
我觉得这道题目的思想是: 走完这一生 如果我和你在一起会变得更好,那我们就在一起,否则我就丢下你。 我回顾我最光辉的时刻就是和不同人在一起,变得更好的最长连续时刻——来自评论区
动态规划
class Solution {
public int maxSubArray(int[] nums) {
int n = nums.length;
//动态规划数组
int[] dp = new int[n];
//初始化第一个元素
dp[0] = nums[0];
//存储答案
int ans = nums[0];
for(int i = 1; i < n; i++){
//判断加上当前元素大,还是当前元素大
dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
//更新答案
ans = Math.max(ans, dp[i]);
}
return ans;
}
}
//优化空间复杂度
class Solution {
public int maxSubArray(int[] nums) {
int pre = 0, ans = nums[0];
for (int x : nums) {
pre = Math.max(pre + x, x);
ans = Math.max(ans, pre);
}
return ans;
}
}
分治
class Solution {
public 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);
}
}
还剩87题!