LeetCode 题解工作台
三个无重叠子数组的最大和
给你一个整数数组 nums 和一个整数 k ,找出三个长度为 k 、互不重叠、且全部数字和最大的子数组,并返回这三个子数组。 以下标的数组形式返回结果,数组中的每一项分别指示每个子数组的起始位置(下标从 0 开始)。如果有多个结果,返回字典序最小的一个。 示例 1: 输入: nums = [1,2,…
4
题型
5
代码语言
3
相关题
当前训练重点
困难 · 状态·转移·动态规划
答案摘要
滑动窗口,枚举第三个子数组的位置,同时维护前两个无重叠子数组的最大和及其位置。 时间复杂度 ,其中 是数组 的长度。空间复杂度 。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路
题目描述
给你一个整数数组 nums 和一个整数 k ,找出三个长度为 k 、互不重叠、且全部数字和最大的子数组,并返回这三个子数组。
以下标的数组形式返回结果,数组中的每一项分别指示每个子数组的起始位置(下标从 0 开始)。如果有多个结果,返回字典序最小的一个。
示例 1:
输入:nums = [1,2,1,2,6,7,5,1], k = 2 输出:[0,3,5] 解释:子数组 [1, 2], [2, 6], [7, 5] 对应的起始下标为 [0, 3, 5]。 也可以取 [2, 1], 但是结果 [1, 3, 5] 在字典序上更大。
示例 2:
输入:nums = [1,2,1,2,1,2,1,2,1], k = 2 输出:[0,2,4]
提示:
1 <= nums.length <= 2 * 1041 <= nums[i] < 2161 <= k <= floor(nums.length / 3)
解题思路
方法一:滑动窗口
滑动窗口,枚举第三个子数组的位置,同时维护前两个无重叠子数组的最大和及其位置。
时间复杂度 ,其中 是数组 的长度。空间复杂度 。
class Solution:
def maxSumOfThreeSubarrays(self, nums: List[int], k: int) -> List[int]:
s = s1 = s2 = s3 = 0
mx1 = mx12 = 0
idx1, idx12 = 0, ()
ans = []
for i in range(k * 2, len(nums)):
s1 += nums[i - k * 2]
s2 += nums[i - k]
s3 += nums[i]
if i >= k * 3 - 1:
if s1 > mx1:
mx1 = s1
idx1 = i - k * 3 + 1
if mx1 + s2 > mx12:
mx12 = mx1 + s2
idx12 = (idx1, i - k * 2 + 1)
if mx12 + s3 > s:
s = mx12 + s3
ans = [*idx12, i - k + 1]
s1 -= nums[i - k * 3 + 1]
s2 -= nums[i - k * 2 + 1]
s3 -= nums[i - k + 1]
return ans
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | O(n + k) |
| 空间 | O(1) |
面试官常问的追问
外企场景- question_mark
Candidate can identify and use sliding window and dynamic programming efficiently.
- question_mark
Candidate understands the importance of lexicographical order in handling multiple solutions.
- question_mark
Candidate can optimize space usage while calculating results for large input sizes.
常见陷阱
外企场景- error
Failing to properly handle overlapping subarrays, leading to incorrect subarray selections.
- error
Not considering the lexicographically smallest answer when multiple solutions have the same sum.
- error
Overcomplicating the problem with unnecessary space usage or inefficient algorithms.
进阶变体
外企场景- arrow_right_alt
Allowing more than three subarrays to be selected, testing the flexibility of the approach.
- arrow_right_alt
Changing the value of k to test how the approach scales with different subarray sizes.
- arrow_right_alt
Introducing constraints on the array values to test the robustness of the algorithm.