2555. 兩個線段獲得的最多獎品

mysteryily發表於2024-09-12

在 X軸 上有一些獎品。給你一個整數陣列 prizePositions ,它按照 非遞減 順序排列,其中 prizePositions[i] 是第 i 件獎品的位置。數軸上一個位置可能會有多件獎品。再給你一個整數 k

你可以同時選擇兩個端點為整數的線段。每個線段的長度都必須是 k 。你可以獲得位置在任一線段上的所有獎品(包括線段的兩個端點)。注意,兩個線段可能會有相交。

  • 比方說 k = 2 ,你可以選擇線段 [1, 3][2, 4] ,你可以獲得滿足 1 <= prizePositions[i] <= 3 或者 2 <= prizePositions[i] <= 4 的所有獎品 i 。

請你返回在選擇兩個最優線段的前提下,可以獲得的 最多 獎品數目。

class Solution {
public:
    int maximizeWin(vector<int>& prizePositions, int k) {
        int n = prizePositions.size();
        if (k * 2 + 1 >= prizePositions[n - 1] - prizePositions[0]) {
            return n;
        }
        int ans = 0, left = 0;
        vector<int> mx(n + 1);
        for (int right = 0; right < n; right++) {
            while (prizePositions[right] - prizePositions[left] > k) {
                left++;
            }
            ans = max(ans, mx[left] + right - left + 1);
            mx[right + 1] = max(mx[right], right - left + 1);
        }
        return ans;
    }
};

複製的明天再看

相關文章