53. Maximum Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4]
,
the contiguous subarray [4,-1,2,1]
has the largest sum = 6
.
这道题就是求一个数组和最大的子串,首先想到的是建立一个等长数组保存前n项的和,这样问题就转化成为了求前后差值最大的题目了,类似于Best Time to Buy and Sell 那个题,但是又有些许不同就是数字可以为负数,这个需要特别讨论。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
vector<int> m;
m.push_back(0);
for (int t : nums) m.push_back(m.back() + t);
m.erase(m.begin());
int min = m[0], n = m[0];
for (int i = 1; i < m.size(); i++) {
if (min > 0) {
if (n <= m[i]) n = m[i];
}
else {
if (n <= m[i] - min) n = m[i] - min;
}
if (min > m[i]) min = m[i];
}
return n;
}
};
做完之后看了答案,发现答案的思路十分简单且清晰,学习了。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int ans = nums[0], i, j, sum = 0;
for (i = 0; i<nums.size(); i++) {
sum += nums[i];
ans = max(sum, ans);
sum = max(sum, 0);
}
return ans;
}
};