leetcode刷题记录——Kadane算法
53 最大子数组和 Medium
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组
是数组中的一个连续部分。
示例 1:
1 | |
示例 2:
1 | |
示例 3:
1 | |
提示:
1 <= nums.length <= 105-104 <= nums[i] <= 104
思路
直接动态规划,记录每个位置的最大子数组和,进而推导出全局最大子数组和
状态转移方程$dp[i] = max(nums[i], nums[i] + dp[i - 1])$
代码
1 | |
918 环形子数组的最大和 Medium
给定一个长度为 n 的环形整数数组 nums ,返回 nums 的非空 子数组 的最大可能和 。
环形数组 意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[(i + 1) % n] , nums[i] 的前一个元素是 nums[(i - 1 + n) % n] 。
子数组 最多只能包含固定缓冲区 nums 中的每个元素一次。形式上,对于子数组 nums[i], nums[i + 1], ..., nums[j] ,不存在 i <= k1, k2 <= j 其中 k1 % n == k2 % n 。
示例 1:
1 | |
示例 2:
1 | |
示例 3:
1 | |
提示:
n == nums.length1 <= n <= 3 * 104-3 * 104 <= nums[i] <= 3 * 104
思路
这题还是用Kadane算法去计算子数组的最大和,但需要注意几个问题。
首先我们在第一个的基础上额外用两个变量去存储当前位置的前一个位置的和(最大或最小)
其次我们还需要注意nums可能全为负
代码
1 | |
时间复杂度
时间复杂度O(n),空间复杂度O(1),执行时间171ms,消耗内存20.4MB
leetcode刷题记录——Kadane算法
https://www.lx02918.ltd/2024/09/04/leetcode-Kadane算法/