您的位置:首页 > 其它

leecode 解题总结:53. Maximum Subarray

2017-02-10 14:53 375 查看
#include <iostream>
#include <stdio.h>
#include <vector>

using namespace std;
/*
问题:
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.

click to show more practice.

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.

分析:
最大连续子数组问题。可以用动态规划来做。
设dp[i]表示以元素A[i]结尾的最大连续子数组的和,则有
dp[i+1] = {A[i+1] ,if dp[i] < 0
{dp[i] + A[i] , else
最后返回dp数组中最大值即可
输入:
9
-2 1 -3 4 -1 2 1 -5 4
输出:
6
*/

class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.empty())
{
return 0;
}
int size = nums.size();
vector<int> dp(size , 0);
dp.at(0) = nums.at(0);
int maxValue = dp.at(0) ;
for(int i = 1 ; i < size ; i++)
{
if(dp.at(i-1) < 0)
{
dp.at(i) = nums.at(i);
}
else
{
dp.at(i) = dp.at(i-1) + nums.at(i);
}
if(dp.at(i) > maxValue)
{
maxValue = dp.at(i);
}
}
return maxValue;
}
};

void process()
{
int num;
int value;
vector<int> nums;
Solution solution;
while(cin >> num)
{
nums.clear();
for(int i = 0 ; i < num ; i++)
{
cin >> value;
nums.push_back(value);
}
int result = solution.maxSubArray(nums);
cout << result << endl;
}
}

int main(int argc , char* argv[])
{
process();
getchar();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: