↓快轉到主要內容
  1. LeetCode/

LeetCode 2779: Maximum Beauty of an Array After Applying Operation

·1 分鐘· ·
LeetCode Medium Sliding-Window Sorting Binary-Search Array
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2026-01-11

  • 提交紀錄:Time Limit Exceeded → Accepted

解題思路
#

每個數 x 可以變成區間 [x - k, x + k] 裡的任何值。一群數能變成同一個值 ⇔ 它們的區間有共同交集 ⇔ 最大值 − 最小值 <= 2k。

題目要的是子序列(不用連續),所以先排序,問題變成「排序後 nums[right] - nums[left] <= 2k 的最長視窗」。

我的嘗試
#

第一版對每個數,把 [x - k, x + k] 裡的每個整數都計數一次,再取最大值,時間 O(n · k),k 到 10^5 時 TLE。

(這個想法本身可以用差分陣列做到 O(n + 值域),但排序 + 滑動視窗更直接。)

正確解法
#

class Solution:
    def maximumBeauty(self, nums: List[int], k: int) -> int:
        nums.sort()
        left = best = 0
        for right, x in enumerate(nums):
            while x - nums[left] > 2 * k:
                left += 1
            best = max(best, right - left + 1)
        return best

複雜度
#

時間 O(n log n),空間 O(1)(不算排序)。

要特別避免的錯誤
#

  • 把每個區間裡的整數都計數:O(n · k)。
  • 條件是 2k,不是 k:兩邊各可以往中間移 k。

面試口說整理
#

每個數可以變成它加減 k 範圍內的任何值,一群數能變成同一個值,代表最大減最小不超過 2k。題目要的是子序列,所以先排序,再用滑動視窗找最大減最小 <= 2k 的最長一段。時間 O(n log n)。

相關文章

LeetCode 1838: Frequency of the Most Frequent Element
·1 分鐘
LeetCode Medium Sliding-Window Sorting Greedy Prefix-Sum Binary-Search Array
LeetCode 1838 解題筆記:排序後,把視窗裡的數都加到 nums[right] 的花費是 nums[right] × 長度 − 視窗總和;花費 > k 就縮左邊
LeetCode 2271: Maximum White Tiles Covered by a Carpet
·1 分鐘
LeetCode Medium Sliding-Window Greedy Sorting Prefix-Sum Binary-Search Array
LeetCode 2271 解題筆記:地毯的左端放在某段白磚的起點一定不會更差;排序後用雙指針,完整蓋住的段累加,最後一段只算部分
LeetCode 3634: Minimum Removals to Balance Array
·1 分鐘
LeetCode Medium Sliding-Window Sorting Binary-Search Array
LeetCode 3634 解題筆記:排序後留下來的一定是連續一段;對每個最小值 nums[left],用只往右走的指針找能留到哪裡,刪掉兩邊剩下的
LeetCode 2831: Find the Longest Equal Subarray
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table Binary-Search Array
LeetCode 2831 解題筆記:對每個值,把它出現的位置列出來;在位置列表上滑動視窗,要刪的數量 = 位置跨度 − 這個值的個數
LeetCode 209: Minimum Size Subarray Sum
·1 分鐘
LeetCode Daily Medium Array Sliding-Window Two-Pointers Prefix-Sum Binary-Search
滑動視窗與雙指針,最小化子陣列長度(總和 ≥ target)。
LeetCode 220: Contains Duplicate III
·2 分鐘
LeetCode Hard Sliding-Window Bucket-Sort Ordered-Set Sorting Array
LeetCode 220 解題筆記:桶大小設成 valueDiff + 1,同一個桶裡的兩個數一定符合;只要再看相鄰兩個桶。視窗只保留最近 indexDiff 個數,所以每個桶最多一個數