题目:
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
.
代码:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int ans = nums[0], sum = 0, i;
for(i = 0; i < nums.size(); i++) {
sum += nums[i];
ans = max(sum, ans);
sum = max(sum, 0);
}
return ans;
}
};
思路:
题目要求找到连续子序列,该subarray的累加值sum最大。
普通算法是对每个nums[i] 计算 sum[i][j] = nums[i] + …… + nums[j], 0 <= i < nums.size(),i < j <= nums.size(),这个算法的复杂度是O(n^2)
用分治算法,即从第一个元素开始累加,得到累加值sum,当sum < 0时,从下一元素开始重新从0累加。同时,用ans存当前最大的累加值,即做完一次加后,当ans < sum,说明此时累加值大于之前的最大累加值;而当ans > sum时,则说明之前的最大累加值仍为当前最大累加值,因此ans = max(sum, ans)即可保证ans所存储的值始终为subarray的最大累加值
此算法得到T(n) = T(n - 1) + O(1),复杂度是O(n),对比普通算法有了明显的优化。