iT邦幫忙

2025 iThome 鐵人賽

DAY 18
0
自我挑戰組

從零開始學習LeetCode系列 第 18

Day 18 Rotate Array

  • 分享至 

  • xImage
  •  

題目:給定一個長度為 n 的整數陣列 nums,以及一個整數 k,請將陣列「向右旋轉」k 步
https://ithelp.ithome.com.tw/upload/images/20251002/201693393KG7fawpa9.jpg


解法一

https://ithelp.ithome.com.tw/upload/images/20251002/20169339KHtkCD3y3R.jpg

  • 直觀,但效率差
  • 適合「第一次接觸」的同學練習
  • https://ithelp.ithome.com.tw/upload/images/20251002/20169339Bduf9dxbLU.jpg

註解

  • nums.pop() → 移除並回傳陣列最後一個元素
  • nums.insert(0, last) → 插到陣列的最前面
  • 重複 k 次後,陣列就被旋轉

理解

  • 想像你有一列人排隊:
    [1,2,3,4,5,6,7]
    旋轉一次,就是把最後一個人(7)拉到最前面:
    [7,1,2,3,4,5,6]
    旋轉三次,就依序拉出 7、6、5 到最前面
    這樣就得到結果 [5,6,7,1,2,3,4]
    缺點是效率不好,因為每次 insert 都要移動其他元素

解法二
https://ithelp.ithome.com.tw/upload/images/20251002/201693399UXvgX2AoH.jpg

  • 額外陣列
  • 速度快,但需要 O(n) 額外空間

註解

  • (i + k) % n → 計算新位置,保證不會超出邊界
  • 建立新陣列 newArr 來存放旋轉後的結果
  • 最後再把結果覆蓋回原本 nums

理解

  • 就像你要搬家:
    每個人(數字)都有一個新位置(用公式算出來)
    搬到新房子(newArr)後,再全部搬回舊房子(nums)

解法三
https://ithelp.ithome.com.tw/upload/images/20251002/20169339E36NIBH3xv.jpg

  • 不需要額外空間,效率高

註解

  • reverse(start, end) → 自己寫一個函式,交換陣列前後元素
  • 整體操作順序:
    (1)[1,2,3,4,5,6,7] → [7,6,5,4,3,2,1]
    (2)前 k=3 個反轉 → [5,6,7,4,3,2,1]
    (3)後面反轉 → [5,6,7,1,2,3,4]

理解

  • 就像把一張紙上的數字「翻轉」幾次:
    (1)先把整張紙上下顛倒
    (2)把前 k 個翻回來
    (3)把後面翻回來
    最後就得到「旋轉」的效果

上一篇
Day 17 Move Zeroes
下一篇
Day 19 Intersection of Two Arrays II
系列文
從零開始學習LeetCode20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言