LeetCode 题解工作台
好子数组的最大分数
给你一个整数数组 nums (下标从 0 开始) 和一个整数 k 。 一个子数组 (i, j) 的 分数 定义为 min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1) 。一个 好 子数组的两个端点下标需要满足 i 。 请你返回 好 子数组的最大可能 …
5
题型
5
代码语言
3
相关题
当前训练重点
困难 · 二分·搜索·答案·空间
答案摘要
我们可以枚举 中的每个元素 作为子数组的最小值,利用单调栈找出其左边第一个小于 的位置 和右边第一个小于等于 的位置 ,则以 为最小值的子数组的分数为 $nums[i] \times (right[i] - left[i] - 1)$。 需要注意的是,只有当左右边界 和 满足 $left[i]+1 \leq k \leq right[i]-1$ 时,答案才有可能更新。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 二分·搜索·答案·空间 题型思路
题目描述
给你一个整数数组 nums (下标从 0 开始)和一个整数 k 。
一个子数组 (i, j) 的 分数 定义为 min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1) 。一个 好 子数组的两个端点下标需要满足 i <= k <= j 。
请你返回 好 子数组的最大可能 分数 。
示例 1:
输入:nums = [1,4,3,7,4,5], k = 3 输出:15 解释:最优子数组的左右端点下标是 (1, 5) ,分数为 min(4,3,7,4,5) * (5-1+1) = 3 * 5 = 15 。
示例 2:
输入:nums = [5,5,4,5,4,1,1,1], k = 0 输出:20 解释:最优子数组的左右端点下标是 (0, 4) ,分数为 min(5,5,4,5,4) * (4-0+1) = 4 * 5 = 20 。
提示:
1 <= nums.length <= 1051 <= nums[i] <= 2 * 1040 <= k < nums.length
解题思路
方法一:单调栈
我们可以枚举 中的每个元素 作为子数组的最小值,利用单调栈找出其左边第一个小于 的位置 和右边第一个小于等于 的位置 ,则以 为最小值的子数组的分数为 。
需要注意的是,只有当左右边界 和 满足 时,答案才有可能更新。
时间复杂度 ,空间复杂度 。其中 为数组 的长度。
class Solution:
def maximumScore(self, nums: List[int], k: int) -> int:
n = len(nums)
left = [-1] * n
right = [n] * n
stk = []
for i, v in enumerate(nums):
while stk and nums[stk[-1]] >= v:
stk.pop()
if stk:
left[i] = stk[-1]
stk.append(i)
stk = []
for i in range(n - 1, -1, -1):
v = nums[i]
while stk and nums[stk[-1]] > v:
stk.pop()
if stk:
right[i] = stk[-1]
stk.append(i)
ans = 0
for i, v in enumerate(nums):
if left[i] + 1 <= k <= right[i] - 1:
ans = max(ans, v * (right[i] - left[i] - 1))
return ans
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | O(n) |
| 空间 | O(1) |
面试官常问的追问
外企场景- question_mark
The candidate demonstrates an understanding of binary search and two-pointer techniques.
- question_mark
The candidate is able to explain how to handle index k as a fixed element in subarrays.
- question_mark
The candidate can describe how to efficiently calculate subarray scores without unnecessary recalculations.
常见陷阱
外企场景- error
Failing to consider the entire valid subarray range that includes index k.
- error
Not efficiently handling the score calculation for varying subarray sizes.
- error
Confusing the logic behind subarray boundaries, leading to incorrect minimum score calculations.
进阶变体
外企场景- arrow_right_alt
Handling larger arrays with more efficient search techniques.
- arrow_right_alt
Exploring different ways to optimize the calculation of the minimum in subarrays.
- arrow_right_alt
Incorporating additional constraints that may limit subarray size or range.