Leetcode-53-(经典题)最大连续子数组和
题目链接
题目描述
一个整数数组 nums ,找出一个具有最大和的连续子数组,返回其最大和。
思路
方法一:动态规划
用 f[i] 表示以 i 结尾的子数组的最大和。
则只需要求出每个位置的 f[i],然后返回 f 数组中的最大值即可。
如何求 f[i] ?
可以考虑 nums[i] 单独成为一段, 还是加入 f[i-1] 对应的那一段,
这取决于 nums[i] 和 f(i−1)+nums[i] 的大小
动态规划转移方程:
\(f(i) = \max \{ f(i-1) + \textit{nums}[i], \textit{nums}[i] \}\)
方法二:分治
就是线段树: 最大子段和 最长上升子序列
方法一:C++代码
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int ans = nums[0];
int n = nums.size();
vector<int> f(n);
f[0] = nums[0];
for (int i = 1; i < n; i++) {
f[i] = max(nums[i], nums[i]+f[i-1]);
ans = max(ans,f[i]);
}
return ans;
}
};