LintCode. 44 最小子数组

参考简书上,六尺帐篷的解题思路,如有侵权,请联系我删除

原文链接:点击打开链接

题目描述:

给定一个整数数组,找到一个具有最小和的子数组。返回其最小和。

注意事项

子数组最少包含一个数字

样例

给出数组[1, -1, -2, 1],返回 -3


解题思路:从我们直观观察来看,很好找出来,就是从负的找起,然后看一下它的左右数,加上之后是不是比原来的还小;这里有一个很关键的地方,在于子数组应该是连续的;具体讲解见代码注释

class Solution {
public:
    /*
     * @param nums: a list of integers
     * @return: A integer indicate the sum of minimum subarray
     */
    int minSubArray(vector<int> &nums) {
        // write your code here
        int min_ending_here =nums[0];
        int min_so_far = nums[0];
        
        for(int i = 1; i < nums.size(); ++i)
        {
            min_ending_here = min(nums[i], nums[i] + min_ending_here);
            //min_ending_here:此数是一个子数组的和,这个子数组的和小于当前元素,也就是加上当前元素,子数组和仍是小
            min_so_far = min(min_ending_here, min_so_far);          
            //找出当前子数组和,以及记录的最小子数组和
        }
        
        return min_so_far;
    }
};


算法的解题技巧还是得研究一下

猜你喜欢

转载自blog.csdn.net/qq_37925512/article/details/79125078
44