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

LeetCode 189: Rotate Array

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

基本資料
#

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

  • 提交紀錄:Wrong Answer ×3 → Accepted → Wrong Answer → Accepted

解題思路
#

往右轉 k 格等於把最後 k 個搬到前面。k 可能比長度大,先 k %= n。不用額外陣列的做法是三次反轉(Two Pointers 模板一):

  1. 整個反轉:最後 k 個跑到前面,但順序是反的。
  2. 前 k 個反轉回來。
  3. 後 n - k 個反轉回來。

我的嘗試
#

前幾版用切片,沒有先對 k 取餘數:k 比長度大時切錯了,例如 [7, 8]、k = 7 回傳 [7, 8],答案 [8, 7];有一版用 n % k,k = 0 時除以 0。

正確解法
#

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        def rev(l, r):
            while l < r:
                nums[l], nums[r] = nums[r], nums[l]
                l, r = l + 1, r - 1
        n = len(nums)
        k %= n
        rev(0, n - 1)
        rev(0, k - 1)
        rev(k, n - 1)

複雜度
#

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

要特別避免的錯誤
#

  • k 要先對長度取餘數。
  • 用切片 nums[-k:] 時,k = 0 會變成整個陣列。

面試口說整理
#

我先把 k 對長度取餘數,再整個反轉、前 k 個反轉、後面的反轉,就完成右轉。時間 O(n)、額外空間 O(1)。

相關文章

LeetCode 204: Count Primes
·1 分鐘
LeetCode Medium Array Math Enumeration Number-Theory
LeetCode 204 解題筆記:埃氏篩,只用質數 p 從 p² 開始把倍數劃掉,外層只要到 √n
LeetCode 48: Rotate Image
·1 分鐘
LeetCode Medium Array Math Matrix
LeetCode 48 解題筆記:順時針轉 90 度 = 先轉置再把每一列左右反轉,兩步都可以原地做
LeetCode 287: Find the Duplicate Number
·1 分鐘
LeetCode Medium Array Two-Pointers Binary-Search Bit-Manipulation
LeetCode 287 解題筆記:把 i -> nums[i] 看成鏈結串列,重複的值就是環的入口,用 Floyd 判圈;O(1) 空間、不改陣列
LeetCode 973: K Closest Points to Origin
·1 分鐘
LeetCode Medium Array Math Divide-and-Conquer Geometry
LeetCode 973 解題筆記:跟 Top-K 一樣,用大小為 k 的 max-heap(存負的距離)保留最近的 k 個點
LeetCode 167: Two Sum II - Input Array Is Sorted
·1 分鐘
LeetCode Medium Array Two-Pointers Binary-Search
LeetCode 167 解題筆記:已排序,左右指針往中間走:和太大右指針左移,太小左指針右移;回傳的 index 從 1 開始
LeetCode 75: Sort Colors
·1 分鐘
LeetCode Medium Array Two-Pointers Sorting Quicksort
LeetCode 75 解題筆記:荷蘭國旗:low 左邊都是 0、high 右邊都是 2;遇到 2 換到 high 之後不要前進,換過來的數還沒檢查