- Description:
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。文章来源:https://www.toymoban.com/news/detail-822738.html
- 解法1:遍历--超时,内存超限,不通过,算法复杂度O(n^3)了吧
int sum(vector<int>& v, int begin, int num)
{
int s = 0;
for(int i = 0; i < num; i++)
s += v[begin+i];
return s;
}
int maxSubArray(vector<int>& nums) {
int max = nums[0], n = 1;
int size = nums.size();
if(size == 1)
return nums[0];
while(n <= size)
{
for(int i = 0; i + n <= size; i++)
{
int s = sum(nums, i, n);
if(s > max)
max = s;
}
n++;
}
return max;
}
- 解法2:动态规划
这里有个关键状态转移方程的定义,dp[i] = max(nums[i], nums[i]+dp[i-1],在这道题里了解到了算法里的无后效性,dp[i]表示以nums中第i个元素结尾的和最大的字符串,所以dp[i]分为两种情况,一种是nums[i]单独一个元素成为字符串,或者加上前边的第[i-1]个元素形成的字符串,即nums[i]+dp[i-1],两者中取最大的即为dp[i]=max(nums[i], nums[i]+dp[i-1])文章来源地址https://www.toymoban.com/news/detail-822738.html
int maxSubArray(vector<int>& nums) {
int size = nums.size();
vector<int> dp(size);
dp[0] = nums[0];
for(int i = 1; i < size; i++)
dp[i] = max(nums[i], nums[i] + dp[i-1]);
int res = dp[0];
for(int i = 0; i < size; i++)
res = max(res, dp[i]);
return res;
}
到了这里,关于LeetCode[53]最大子数组和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!