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
思路:
本题目为最基本的动态规划题目,当然也可以通过暴力解决,我们的惯性思维是通过以某一节点为开头进行遍历,但是在该题目中使用动态规划,以某一节点为结尾进行遍历(尾固定,头移动)能够取得更好的效果,
关于使用不同的遍历方式,以及通过该题目入门动态规划,可以参考文章:最大子数组和—理解动态规划入门、子串以及子序列题目三种遍历思想
C++代码:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int len = nums.size();
int dp[len];
dp[0] = nums[0];
// vector<int>::iterator it = nums.begin() + 1;
for(int i = 1; i < nums.size() ; i++){
if(dp[i-1] <= 0)
dp[i] = nums[i];
else
dp[i] = dp[i-1] + nums[i];
}
int ans = dp[0];
for( int i=1; i < nums.size(); i++)
if(dp[i] > ans) ans = dp[i];
return ans;
}
};