[
array
sliding window
heap
monotonic deque
]
Leetcode 1499. Max Value of Equation
Problem statement
https://leetcode.com/problems/max-value-of-equation/
Solution
There are different solutions, and the fastest one uses the idea of monotonic deque. What is actually asked in this problem is find max(yi - xi + (yj + xj)), where j > i and xj - xi <= k. The idea is to keep sliding window of points, such that:
while deq and deq[0][0] < x - k: deq.popleft()In this line we make sure, that we do not have old points, that is if|x_j - x_i| > k, we remove this point from left side of or sliding window.if deq: ans = max(ans, deq[0][1] + x + y). In this line we update our answer: in fact we need to find(yi - xi + (yj + xj))and if right end of our windowjis fixed, we need to choose maximum amongyi - xiin our window.while deq and y - x >= deq[-1][1]: deq.pop(): we have always decreasing elements in our deque, by key(y - x), so the biggest element will be the first one, we used it in step2.- Finally we append key
(x, y - x)to our deque to the right.
Note, that we can as well just append index i to deque, and then code will be more difficult to read.
Complexity
Time complexity is O(n), space is O(n) as well.
Code
class Solution:
def findMaxValueOfEquation(self, P, k):
deq, ans = deque(), -float("inf")
for x, y in P:
while deq and deq[0][0] < x - k: deq.popleft()
if deq: ans = max(ans, deq[0][1] + x + y)
while deq and y - x >= deq[-1][1]: deq.pop()
deq.append((x, y-x))
return ans
Remark
Other ways to solve is heap with lazy updates with complexity O(n log n) or sorted list with O(n log n) complexity as well.