标签:for over cto 连续 within ping class ini 最大的
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
.
问题: 给定一个元素有正有负的数组,求最大连续子数组的和。
思路:
设辅助数组 v, v[i] 表示以 nums[i] 为右端元素的最大连续子数组的和。v[i], v[i-1] 以及 nums[i] 的关系如下。
v[i] = max( nums[i], nums[i] + v[i-1] )
数组 v 中的最大值,则是整个数组的最大连续子数组的和。
class Solution { public: /** * 求一维数组的最大值元素的值 * */ int maxElement(vector<int>& v){ if(v.size() == 0){ return 0; } int max = v[0]; for (int i = 0 ; i < v.size(); i++) { if (v[i] > max) { max = v[i]; } } return max; } int maxSubArray(vector<int>& nums) { bool hasPositive = false; vector<int> v(nums.size(), 0); if (nums[0] >= 0 ) { hasPositive = true; v[0] = nums[0]; }else{ v[0] = 0; } for (int i = 1 ; i < nums.size(); i++) { if (v[i-1] + nums[i] >= 0) { hasPositive = true; v[i] = v[i-1] + nums[i]; } } // print_vector(v); int res; if (hasPositive == false) { res = maxElement(nums); }else{ res = maxElement(v); } return res; } };
本题目是一年前做的,在这里记录下解题思路。补充几点理解:
1. 从上面数组 v 的公式中,可以看出本问题满足 DP 的两个主要性质 overlapping substructure & optimal substructure 。
2. 由于只需要求出最大的连续子数组之和,上面算法可以不用辅助数组,节省空间。有辅助数组,方便查看校对中间结果。
3. 本题的解题思路,也可以理解为是一个滑动窗口算法,通过滑动窗口的左右两端 l 和 r, 求得所有元素分别为右端的最大连续子数组,其中的最大值即为题目的姐。
[LeetCode] 53. Maximum Subarray 解题思路
标签:for over cto 连续 within ping class ini 最大的
原文地址:http://www.cnblogs.com/TonyYPZhang/p/6280202.html