1499. 满足不等式的最大值
大约 3 分钟
---
1499. 满足不等式的最大值
- 标签:队列、数组、滑动窗口、单调队列、堆(优先队列)
- 难度:困难
题目链接
题目大意
描述:给定一个数组 ,其中 且 。还有一个整数 。
要求:返回满足 的最大 值。
说明:
- 。
- 。
示例:
- 示例 1:
输入:points = [[1,3],[2,0],[5,10],[6,-10]], k = 1
输出:4
解释:前两个点满足 |xi - xj| <= 1 ,代入方程计算,则得到值 3 + 0 + |1 - 2| = 4 。第三个和第四个点也满足条件,得到值 10 + -10 + |5 - 6| = 1 。
没有其他满足条件的点,所以返回 4 和 1 中最大的那个。- 示例 2:
输入:points = [[0,0],[3,0],[9,2]], k = 3
输出:3
解释:只有前两个点满足 |xi - xj| <= 3 ,代入方程后得到值 0 + 0 + |0 - 3| = 3 。解题思路
思路 1:单调队列
1. 核心思想
因为 ,。公式变为:
对于固定的 ,要最大化 ,只需在满足 的 中最大化 。
这是一个滑动窗口最大值问题,用单调队列维护 的最大值,且 在 范围内。
2. 具体步骤
第 1 步:用双端队列 存储索引,按 从大到小排列。
第 2 步:遍历 :
- 从队头移除不满足 的索引。
- 如果 非空,用队头计算候选值 更新答案。
- 将 加入队列(维护单调递减)。
- 当队尾的 时,弹出队尾。
第 3 步:返回答案。
3. 举例说明
以 为例:
- :队列空,入队 ,
- :, 在范围内。队头 ,候选 ,更新 。入队 ()。
- :,弹出 。,弹出 。队列空, 无配对。入队 ()。
- :,候选 , 不变。入队 ()。
结果:。
思路 1:代码
from collections import deque
class Solution:
def findMaxValueOfEquation(self, points: List[List[int]], k: int) -> int:
n = len(points)
dq = deque()
ans = float('-inf')
for j in range(n):
xj, yj = points[j]
# 移除窗口外的点
while dq and xj - points[dq[0]][0] > k:
dq.popleft()
# 用队头计算答案
if dq:
i = dq[0]
ans = max(ans, (points[i][1] - points[i][0]) + (yj + xj))
# 维护单调递减(按 yi - xi)
while dq and (points[dq[-1]][1] - points[dq[-1]][0]) <= (yj - xj):
dq.pop()
dq.append(j)
return ans思路 1:复杂度分析
- 时间复杂度:,每个元素入队出队各一次。
- 空间复杂度:。