There are some prizes on the X-axis. You are given an integer array prizePositions
that is sorted in non-decreasing order, where prizePositions[i]
is the position of the ith
prize. There could be different prizes at the same position on the line. You are also given an integer k
.
You are allowed to select two segments with integer endpoints. The length of each segment must be k
. You will collect all prizes whose position falls within at least one of the two selected segments (including the endpoints of the segments). The two selected segments may intersect.
- For example if
k = 2
, you can choose segments[1, 3]
and[2, 4]
, and you will win any prize i that satisfies1 <= prizePositions[i] <= 3
or2 <= prizePositions[i] <= 4
.
Return the maximum number of prizes you can win if you choose the two segments optimally.
Example 1:
Input: prizePositions = [1,1,2,2,3,3,5], k = 2 Output: 7 Explanation: In this example, you can win all 7 prizes by selecting two segments [1, 3] and [3, 5].
Example 2:
Input: prizePositions = [1,2,3,4], k = 0 Output: 2 Explanation: For this example, one choice for the segments is[3, 3]
and[4, 4],
and you will be able to get2
prizes.
Constraints:
1 <= prizePositions.length <= 105
1 <= prizePositions[i] <= 109
0 <= k <= 109
prizePositions
is sorted in non-decreasing order.
Companies: Uber
Related Topics:
Array, Binary Search, Sliding Window
Similar Questions:
// OJ: https://leetcode.com/problems/maximize-win-from-two-segments
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(N)
class Solution {
public:
int maximizeWin(vector<int>& A, int k) {
int N = A.size(), ans = 0;
vector<int> right(N + 1);
for (int i = N - 1, j = N - 1; i >= 0; --i) {
while (A[j] > A[i] + k) --j;
right[i] = max(right[i + 1], j - i + 1);
}
for (int i = 0, j = 0; i < N; ++i) {
while (j < N && A[j] <= A[i] + k) ++j;
ans = max(ans, j - i + right[j]);
}
return ans;
}
};