LC : https://leetcode-cn.com/problems/maximum-subarray/
牛客:https://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484?tpId=13&&tqId=11183&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路和算法:
**
假设 nums 数组的长度是 n,下标从 0 到 n−1。

我们用 30.连续子数组的最大和 - 图1 代表 nums[i],用 30.连续子数组的最大和 - 图2 代表以第 ii个数结尾的「连续子数组的最大和」,那么很显然我们要求的答案就是:

公式 : 30.连续子数组的最大和 - 图3

因此我们只需要求出每个位置的 30.连续子数组的最大和 - 图4,然后返回 f 数组中的最大值即可。那么我们如何求30.连续子数组的最大和 - 图5呢?我们可以考虑 30.连续子数组的最大和 - 图6
单独成为一段还是加入30.连续子数组的最大和 - 图7对应的那一段,这取决于30.连续子数组的最大和 - 图830.连续子数组的最大和 - 图9+ 30.连续子数组的最大和 - 图10 的大小,我们希望获得一个比较大的,于是可以写出这样的动态规划转移方程:

30.连续子数组的最大和 - 图11

代码

  1. class Solution {
  2. public:
  3. int maxSubArray(vector<int> &num) {
  4. int maxValue = num[0];
  5. int pre=0;
  6. for (int i = 0; i < num.size(); ++i) {
  7. pre = max(pre + num[i], num[i]);
  8. maxValue = max(maxValue, pre);
  9. }
  10. return maxValue;
  11. }
  12. };