leetcode系列(61)Maximum Subarray

来源:互联网 发布:网络配置 编辑:程序博客网 时间:2024/06/17 15:39

Find thecontiguous subarray within an array (containing at least one number) which hasthe largest sum.

Forexample, given the array [−2,1,−3,4,−1,2,1,−5,4],
the contiguous subarray [4,−1,2,1] has the largest sum = 6.

Morepractice:

If youhave figured out the O(n) solution, try coding another solution usingthe divide and conquer approach, which is more subtle.

解答:这个题目之前我见过,naive的方法(当然不是brute force)是遍历数组,对每个idx就以它为起点一直往前累加直到sum <= 0,这个过程中也会更新max_sum。还有一种好的方法是动态规划,对于每个idx,nums[idx]为结尾的subArray,nums[idx]要么接之前的subArray,要么自己另起一个,有且仅有这两种情况;那么以nums[idx]为结尾的subArray的最大sum即f[idx]就是max(f(idx - 1) + nums[idx], nums[idx]);任何一个idx都可能是Maximum Subarray的结尾,那么max(f[idx])就是Maximum Subarray的sum了;因为我只需要最大值,所以不需要一个数组存储中间结果(还有什么分治法)。

方法1

int maxSubArray(vector<int>& nums) {        int ret = -INT_MIN;        for (size_t i = 0; i < nums.size(); ++i) {            int cur = nums[i];            if (cur > ret) {                ret = cur;            }            for (size_t j = i + 1; j < nums.size(); ++j) {                cur += nums[j];                if (cur <= 0) {                    break;                } else if (cur > ret) {                    ret = cur;                }            }        }        return ret;    }

方法2

    int maxSubArray(vector<int>& nums) {        int ret = -INT_MIN;        int cur_max = 0;        for (size_t i = 0; i < nums.size(); ++i) {            cur_max = std::max(cur_max + nums[i], nums[i]);            ret = std::max(cur_max, ret);        }        return ret;    }


0 0
原创粉丝点击