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

LeetCode 396: Rotate Function

·1 分鐘· ·
LeetCode Medium Array Math Dynamic-Programming
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-11-16

  • 提交紀錄:Time Limit Exceeded → Wrong Answer ×2 → Accepted

解題思路
#

每旋轉一次,除了最後一個元素以外,每個元素的係數都加 1,總共多了 sum - nums[last];最後一個元素的係數從 n - 1 變成 0,少了 (n - 1) × nums[last]。合起來 F(k) = F(k - 1) + sum - n × nums[n - k]。先算 F(0),再用這個遞推算出全部,O(n)(Linear DP 模板一)。

我的嘗試
#

  • 2022 年第一版直接算每個旋轉的值,O(n²) TLE,而且 range(len(nums) - 1) 少算了一種旋轉。第二版的遞推公式沒有把結果累加回 cur_sum,每次都是從 F(0) 算。
  • 2026 年重寫時,被移到最前面的 index 寫成固定從 3 開始(照著範例的長度寫死了),換一個長度就錯;改成 range(n - 1, 0, -1) 才 AC。

正確解法
#

class Solution:
    def maxRotateFunction(self, nums: List[int]) -> int:
        n, total = len(nums), sum(nums)
        cur = best = sum(i * x for i, x in enumerate(nums))
        for k in range(1, n):
            cur += total - n * nums[n - k]
            best = max(best, cur)
        return best

複雜度
#

時間 O(n),空間 O(1)。

要特別避免的錯誤
#

  • 每次旋轉移到最前面的是 nums[n - k],index 要跟著 k 變。
  • 直接算每個旋轉是 O(n²),會 TLE。

面試口說整理
#

每旋轉一次,除了被移到最前面的那個數,其他數的係數都加一,所以 F(k) 等於 F(k - 1) 加上總和、再減掉 n 乘上被移到最前面的數。我先算 F(0),再用遞推算出所有旋轉的值取最大。時間 O(n)。

相關文章

LeetCode 313: Super Ugly Number
·1 分鐘
LeetCode Medium Array Math Dynamic-Programming
LeetCode 313 解題筆記:LC 264 的推廣,每個質數一個指針;用 heap 的話要避免同一個數被推進去很多次
LeetCode 435: Non-overlapping Intervals
·1 分鐘
LeetCode Medium Array Dynamic-Programming Greedy Sorting
LeetCode 435 解題筆記:最少刪幾個 = 總數減掉最多能保留幾個;按右端點排序,貪心保留結束最早的
LeetCode 473: Matchsticks to Square
·1 分鐘
LeetCode Medium Array Dynamic-Programming Backtracking Bit-Manipulation
LeetCode 473 解題筆記:總和要能被 4 整除;由大到小把每根火柴放進四個邊之一,超過邊長或跟前一個邊長度相同就跳過
LeetCode 264: Ugly Number II
·1 分鐘
LeetCode Medium Hash-Table Math Dynamic-Programming Heap-Priority-Queue
LeetCode 264 解題筆記:三個指針分別指向下一個要乘 2、3、5 的醜數,每次取最小的,相等的指針都要前進
LeetCode 189: Rotate Array
·1 分鐘
LeetCode Medium Array Math Two-Pointers
LeetCode 189 解題筆記:先 k %= n,再用三次反轉:整個反轉、前 k 個反轉、後 n - k 個反轉;O(1) 額外空間
LeetCode 204: Count Primes
·1 分鐘
LeetCode Medium Array Math Enumeration Number-Theory
LeetCode 204 解題筆記:埃氏篩,只用質數 p 從 p² 開始把倍數劃掉,外層只要到 √n