本文首发于 语雀文档

题目

https://leetcode-cn.com/problems/maximum-subarray/

流程图、调试代码

https://github.com/blueju/leetcode/

第 1 次尝试

一如往常,写不出来,但还是有些小思路的。

  1. 看到求最大,想到了《无重复的最长子串》,需要有一个变量将每次求得的和记录起来,并再每次循环中进行进行 max 比较赋值。
  2. 第一时间就是想到类似滑动窗口的解法,《无重复的最长子串》中发现重复字符串就会 break,那我们这的 break 的条件是什么呢?(因为不 break 后面的字符串就不再是无重复的了)

看题目名字,应该很快能反应过来,我们 break 的条件是:此次计算的和不再更大时(是不是最大我们不知道,但是如果叠加数任一一个小于零,那和不用说肯定更小)

第 2 次尝试(通过测试用例)

流程图

这次该用 PPT 的形式呈现

最大子序和.pptx

代码

  1. /**
  2. * @param {number[]} nums
  3. * @return {number}
  4. */
  5. var maxSubArray = function (nums) {
  6. let maxSum
  7. let prevSum
  8. for (let i = 0; i < nums.length; i++) {
  9. const length = nums.length
  10. if (length === 0) {
  11. return nums[0]
  12. }
  13. if (i === 0) {
  14. maxSum = nums[i]
  15. prevSum = nums[i]
  16. currSum = nums[i]
  17. continue
  18. }
  19. if (prevSum < 0) {
  20. currSum = nums[i]
  21. maxSum = Math.max(maxSum, currSum)
  22. prevSum = currSum
  23. } else {
  24. currSum = prevSum + nums[i]
  25. maxSum = Math.max(maxSum, currSum)
  26. prevSum = currSum
  27. }
  28. }
  29. return maxSum
  30. };
  1. /**
  2. * @param {number[]} nums
  3. * @return {number}
  4. */
  5. var maxSubArray = function (nums) {
  6. const length = nums.length
  7. if (length === 1) return nums[0]
  8. let maxPrevSum
  9. let maxSum
  10. for (let i = 0; i < length; i++) {
  11. if (i === 0) {
  12. maxPrevSum = nums[i]
  13. maxSum=nums[i]
  14. continue
  15. }
  16. const currSum = maxPrevSum + nums[i]
  17. if (currSum < nums[i]) {
  18. maxPrevSum = nums[i]
  19. maxSum = Math.max(nums[i], maxSum)
  20. } else {
  21. maxPrevSum = currSum
  22. maxSum = Math.max(currSum, maxSum)
  23. }
  24. }
  25. return maxSum
  26. };