Maximum Subarray(leetcode)

来源:互联网 发布:mac多余账户删不了 编辑:程序博客网 时间:2024/06/05 03:06

Maximum Subarray

  • Maximum Subarray
    • 题目
    • 解决


题目

leetcode
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.


解决

想法:题目要求在给定的数组里面找到一个连续的子数组,使得子数组中的数相加之后得到的和最大。而子数组有一个特征:contiguous,这样我们可以根据这个特征来求得答案。
现在先举一个例子:原数组array为[-2,1,-3,4,-1,2,1,-5,4],符合上面题目要求的子数组有[-2,1][-2,1,-3][1,-3,4][-1,2,1][-2,1,-3,4][-1,2,1,-5][-2,1,-3,4,-1][-1,2,1,-5,4]等等。
从这些子数组我们可以发现,要在这些子数组里面得到一个数组的和最大的子数组,假设我们需要的答案为result,从array[0]开始对数组进行遍历,遍历过程中,数字累加得到sum,每次更新result值,result = (sum > result) ? sum : result
需要注意一点的是,如果原数组为[1,2,3,-2,-4,-3,5,5,4],预期的答案为14,但是程序得出的结果却是11。出现这样情况的原因:遍历到-3的时候,此时,sum = -3,不对sum进行处理会影响后面的结果。因此可以在sum < 0的时候,重新将sum置零,这样就能够解决问题了。

class Solution {public:    int maxSubArray(vector<int>& nums) {        int num = nums.size();        int result = nums[0]; // 原数组可能只有一个数        int sum = 0;        for (int i = 0; i < num; i++) {            sum += nums[i];            result = (sum > result) ? sum : result;            sum = (sum > 0) ? sum : 0; // 避免上面提到的问题        }        return result;    }};
原创粉丝点击