Algorithms(二)Maximum Subarray

来源:互联网 发布:腾讯tim ubuntu 编辑:程序博客网 时间:2024/06/06 00:54

题目:

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),对比普通算法有了明显的优化。


原创粉丝点击