[leetcode]53. Maximum Subarray

来源:互联网 发布:storm1.0java源码 编辑:程序博客网 时间:2024/06/07 06:31

divide and conquer

题目:

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.

思路:

子串与子序列:子串是指数组中连续的若干个元素。而子序列仅仅要求各元素的顺序与其在数组中一致,而没有连续的要求。对于一个元素数为n的数组,其含有2^n个子序列和n(n+1)/2个子串。

例如:一个字符串 awbcdewgh
子串: awbc. awbcd awbcde ….很多个子串,但是都是连续在一起
子序列: abc . abcd abcde … 很多个子序列,但是子序列中的字符在字符串中不一定是连在一起的, 但是子序列一定是单调的, (即字符之间ASCII单调递增或单调递减)

动态规划

遍历整个数组,dp[i]记录以nums[i]为结尾的连续的数的段的和的最大值,即dp[i] = max(nums[i], dp[i-1]+nums[i])。然后用max记录dp[i]的最大值。

class Solution {public:    int maxSubArray(vector<int>& nums) {        vector<int> dp(nums.size());        int m = nums[0];        dp[0] = nums[0];        for (int i = 1; i < nums.size(); i++) {            dp[i] = max(nums[i], dp[i-1]+nums[i]);            m = max(m, dp[i]);        }        return m;    }};
原创粉丝点击