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

LeetCode 1838: Frequency of the Most Frequent Element

·1 分鐘· ·
LeetCode Medium Sliding-Window Sorting Greedy Prefix-Sum 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

  • 提交紀錄:Accepted(一次通過)

解題思路
#

只能加不能減,所以目標值一定是某個原本就有的數 nums[right],而要變成它的,應該是比它小、而且最接近它的那些數(加的次數最少)。

排序後,視窗 [left, right] 全部加到 nums[right] 的花費:

cost = nums[right] × (right - left + 1) − sum(nums[left..right])

right 固定時,視窗越大花費越大;left 固定時 right 往右,花費也只會變大。條件單調,用「求最長」的滑動視窗。

我的解法
#

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

我第一次 AC 的寫法是自己維護一個「目前的目標值」和累計花費,目標值變大時再補上差額,邏輯比較繞。用「目標值 × 長度 − 總和」直接算花費比較清楚。

複雜度
#

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

要特別避免的錯誤
#

  • 目標值不是任意值:一定是視窗最右邊(最大)的那個數。
  • 花費會很大,Python 沒問題,其他語言要用 64 位元整數。

面試口說整理
#

只能加,所以目標一定是某個原本的數,而且要從比它小、最接近它的數加上去。我排序後用滑動視窗,以右端為目標,花費是右端乘長度減掉總和,超過 k 就縮左邊,記錄最長長度。時間 O(n log n)。

相關文章

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 2779: Maximum Beauty of an Array After Applying Operation
·1 分鐘
LeetCode Medium Sliding-Window Sorting Binary-Search Array
LeetCode 2779 解題筆記:每個數可以變成 [x - k, x + k] 裡的任何值,一群數能變成同一個值 ⇔ 最大 - 最小 <= 2k;排序後找最長的這種視窗
LeetCode 209: Minimum Size Subarray Sum
·1 分鐘
LeetCode Daily Medium Array Sliding-Window Two-Pointers Prefix-Sum Binary-Search
滑動視窗與雙指針,最小化子陣列長度(總和 ≥ target)。
LeetCode 1208: Get Equal Substrings Within Budget
·1 分鐘
LeetCode Medium Sliding-Window String Binary-Search Prefix-Sum
LeetCode 1208 解題筆記:每個位置的花費是 |s[i] - t[i]|,題目變成「總和 <= maxCost 的最長子陣列」
LeetCode 2024: Maximize the Confusion of an Exam
·1 分鐘
LeetCode Medium Sliding-Window String Binary-Search Prefix-Sum
LeetCode 2024 解題筆記:視窗合法的條件是 T 和 F 比較少的那個 <= k(把少的全部改掉);不合法就縮左邊