53. 最大子数组和

type
status
date
slug
summary
tags
category
difficulty
icon
password

53. 最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组
是数组中的一个连续部分。
示例 1:
示例 2:
示例 3:
提示:
  • 1 <= nums.length <= 105
  • 104 <= nums[i] <= 104
解题思路:
这道题可以使用动态规划或者贪心的思想来解决。以下是代码的详细解释:

解题步骤

  1. 初始化:
  • 设置结果变量 res 为最小整数值
  • 设置当前子数组和 t 为0
  • 设置遍历指针 i 和子数组起始位置 j
  1. 遍历数组:
  • 累加当前元素到子数组和 t
  • 更新最大子数组和 res,取 rest 的较大值
  • 如果当前子数组和小于等于0,重置子数组:
    • 将起始位置 j 移动到下一个位置
    • 重置子数组和 t 为0
  1. 返回最终的最大子数组和 res

算法思路解析

这个解法的核心思想是:
  • 如果当前子数组和为负数,那么它对后面的子数组和只会产生负面影响,因此可以直接舍弃,从下一个元素重新开始计算
  • 如果当前子数组和为正数,即使后面有负数,只要总和还是正的,就可以继续累加
  • 通过不断更新 res,我们能够在遍历过程中记录下最大的子数组和

时间复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。我们只需要遍历一次数组。
  • 空间复杂度:O(1),只使用了常数个变量。

举例说明

以示例1为例:nums = [-2,1,-3,4,-1,2,1,-5,4]
  • 遍历到 -2:t = -2,res = -2,由于 t ≤ 0,重置 t = 0
  • 遍历到 1:t = 1,res = 1
  • 遍历到 -3:t = -2,res = 1,由于 t ≤ 0,重置 t = 0
  • 遍历到 4:t = 4,res = 4
  • 遍历到 -1:t = 3,res = 4
  • 遍历到 2:t = 5,res = 5
  • 遍历到 1:t = 6,res = 6
  • 遍历到 -5:t = 1,res = 6
  • 遍历到 4:t = 5,res = 6
最终返回 res = 6,即为最大子数组和。
上一篇
56. 合并区间
下一篇
76. 最小覆盖子串

评论
Loading...