您的位置:首页 > 其它

Leetcode 53. Maximum Subarray 贪心或动态规划

2017-11-03 23:39 483 查看

题目

Maximum Subarray

给定一个整数数组nums
,让我们找出其相邻元素构成的子串的最大和。

例如:数组 [-2, 1,- 3, 4, -1, 2, 1, -5, 4], 其子串 [4,-1,2,1] 具有最大和为 6。

思路

贪心

假设已知一个连续子串的和sum,

如果sum >= 0,则sum对于后面的元素有利,可以保留用于后续计算

如果sum < 0,则sum对后面元素不利,重置为0

然后维护一个全局的max即可

动态规划

状态:f[i] 表示以 元素nums[i] 结尾的子串的最大和

状态转移:f[i+1] = max {f[i] + nums[i+1], nums[i+1]}

代码

贪心

class Solution {
public:
int maxSubArray(vector<int>& nums) {
int sum, max;

sum = 0;
max = nums[0];

for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
max = sum > max? sum: max;
sum = sum > 0? sum: 0;
}

return max;
}
};


动态规划

class Solution {
public:
int maxSubArray(vector<int>& nums) {
//f[i]为以nums[i]结尾的子串的最大和
//f[i] = max {f[i-1] + nums[i], nums[i]}
int *f = new int[nums.size()];
int maxsum;

f[0] = maxsum = nums[0];

for (int i = 1; i < nums.size(); i++) {
f[i] = max(f[i - 1] + nums[i], nums[i]);
maxsum = f[i] > maxsum? f[i]: maxsum;
}

return maxsum;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: