0
点赞
收藏
分享

微信扫一扫

[数组]53. 最大子数组和-简单

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。


子数组 是数组中的一个连续部分。


 


示例 1:


输入:nums = [-2,1,-3,4,-1,2,1,-5,4]

输出:6

解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:


输入:nums = [1]

输出:1

示例 3:


输入:nums = [5,4,-1,7,8]

输出:23

 


提示:


1 <= nums.length <= 105

-104 <= nums[i] <= 104


来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/maximum-subarray

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

贪心解法

思路如下:

  1. 使用sum记录到达当前索引的时候最大的连续子数组的和
  2. sum初始化为nums[0]
  3. 遍历数组,到达索引i的时候,sum表示前面i个最大的连续子数组的和
  1. 如果sum > 0 ,则表示可以将当前元素和之前的sum累加,即 sum = sum + nums[i]
  2. 否则,sum = nums[i]

代码如下:

class Solution {
public:
int maxSubArray(vector<int>& nums) {
if (nums.size() == 0)
{
return 0;
}

int sum = nums[0];
int ans = sum;
for (int i = 1;i < nums.size();++i)
{
int tmp = sum + nums[i];
if (sum > 0)
{
sum = tmp;
}
else
{
sum = nums[i];
}

ans = std::max(ans,sum);
}
return ans;
}
};


动态规划解法

class Solution
{
public:
int maxSubArray(vector<int> &nums)
{
int result = INT_MIN;
int numsSize = int(nums.size());
//dp[i]表示nums中以nums[i]结尾的最大子序和
vector<int> dp(numsSize);
dp[0] = nums[0];
result = dp[0];
for (int i = 1; i < numsSize; i++)
{
dp[i] = max(dp[i - 1] + nums[i], nums[i]);
result = max(result, dp[i]);
}

return result;
}
};
举报

相关推荐

0 条评论