class Solution {
public:
int maxSubArray(vector<int>& nums) {
long long ans = -3e9,cnt = 0, his=0, n = nums.size();
for(int i=0;i<n;i++){
if(his<0){
// 如果 以上一个数结尾的子数组的和 小于0,那就不要前面这段
cnt = nums[i];
}else{
// 否则前面的那段和这个数连起来构成一段
cnt = nums[i]+his;
}
ans = max(ans,cnt);
his = cnt;
}
return (int)ans;
}
};
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n = nums.size() ,ans = -1e9;
vector<int> dp(n+1,0);
for(int i=1;i<=n;i++){
dp[i] = max(dp[i-1]+nums[i-1],nums[i-1]);
ans = max(ans,dp[i]);
}
return ans;
}
};
如果进行空间的压缩之后,其实就贪心的做法。
注意此解法的时间复杂度为: O ( n ) O(n) O(n),而不是 O ( n ∗ l o g ( n ) ) O(n*log(n)) O(n∗log(n)),用二叉树的遍历来理解就很好懂。
class Solution {
public:
struct Node{
int s,ls,rs,ms;
Node(int s,int ls,int rs,int ms):s(s),ls(ls),rs(rs),ms(ms){}
};
int maxSubArray(vector<int>& nums) {
return dc(0,nums.size()-1,nums).ms;
}
Node dc(int l,int r,vector<int>& nums){
if(l==r){
return Node(nums[l],nums[l],nums[l],nums[l]);
}
int mid = l+(r-l)/2;
Node ln = dc(l,mid,nums);
Node rn = dc(mid+1,r,nums);
int s = ln.s+rn.s;
int ls = max(ln.ls,ln.s+rn.ls);
int rs = max(rn.rs,rn.s+ln.rs);
int ms = max(max(ln.ms,rn.ms),ln.rs+rn.ls);
return Node(s,ls,rs,ms);
}
};