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.

More practice:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.

分析
  这道题是求连续子数组最大和问题,使用动态规划方法,解体思路:
  如果用函数f(i)表示以第i个数字结尾的子数组的最大和,那么我们需要求出max(f[0…n])。我们可以给出如下递归公式求f(i):
这里写图片描述

这个公式的意义:

  当以第(i-1)个数字为结尾的子数组中所有数字的和f(i-1)小于0时,如果把这个负数和第i个数相加,得到的结果反而不第i个数本身还要小,所以这种情况下最大子数组和是第i个数本身。
  如果以第(i-1)个数字为结尾的子数组中所有数字的和f(i-1)大于0,与第i个数累加就得到了以第i个数结尾的子数组中所有数字的和。

C++代码

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        //cunSum表示以i结尾的最大和字数组
        int cunSun = nums[0];
        //结果值
        int ans = cunSun;   
        int size = nums.size();
        for(int i=1;i<size;i++){
            cunSun = max(cunSun+nums[i],nums[i]);
            ans = max(ans,cunSun);
        }
        return ans;
    }
};

总结
  动态规划问题,还需继续积累,题目中提示用分治法,因为水平有限,还没有弄懂分治法怎么求解问题,如果以后学习了分治法,再来重新用分治法解一下这道题目。

你可能感兴趣的:(LeetCode,动态规划,最大和,连续子数组)