iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0

https://ithelp.ithome.com.tw/upload/images/20240921/20124462qD5ig2AmVh.png

就地旋轉,玩轉 2D 矩陣魔法

當你面對一個看似簡單的問題時,有沒有感覺到腦袋瞬間卡住?不急,今天我們來挑戰一道有趣的小題目,讓你的腦袋轉個彎!(說的就是題目本身啦 😆)這道題要求我們對一個 n x n 的 2D 矩陣進行 90 度的順時針旋轉,想想看我們怎麼能優雅地解決這個問題吧!


題目 Rotate Image

You are given an n x n 2D matrix representing an image, rotate the image by 90 degrees (clockwise).

You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and do the rotation.

你會得到一個 n x n 的 2D 矩陣,代表一張圖片,我們要將這個圖片 順時針旋轉 90 度

請注意,必須 就地 (in-place) 旋轉,也就是直接修改原始的 2D 矩陣,禁止 分配其他 2D 矩陣來幫助進行旋轉。

範例 1:

  • 輸入: matrix = [[1,2,3],[4,5,6],[7,8,9]]
  • 輸出: [[7,4,1],[8,5,2],[9,6,3]]

範例 2:

  • 輸入: matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
  • 輸出: [[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

思考方向

這題的關鍵在於 就地操作,也就是在原本的矩陣中直接變換數字的位置。考慮每個元素如何移動會幫助我們理解這個問題的本質。

想像我們站在一個陣列的左上角,我們要把它移到右上角的位置,而原本右上角的數字則移到右下角,這樣繞一圈的動作就是所謂的旋轉!

實作解法

主要步驟:

  1. 轉置矩陣 (Transpose Matrix): 將矩陣的行列對調,把第 i 行變成第 i 列。
  2. 反轉每一行: 將每一行的數字從左到右進行反轉。

這樣就完成了順時針旋轉 90 度的效果!

程式碼

function rotate(matrix: number[][]): void {
    // 1. 轉置矩陣:將矩陣的行列對調
    for (let i = 0; i < matrix.length; i++) {
        for (let j = i; j < matrix[i].length; j++) {
            // 交換元素 matrix[i][j] 和 matrix[j][i]
            [matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]];
        }
    }

    // 2. 反轉每一行
    for (let i = 0; i < matrix.length; i++) {
        matrix[i].reverse();
    }
}

解釋

  1. 轉置矩陣 (Transpose Matrix): 將矩陣中的每個元素與其對角線的元素互換,例如 matrix[0][1] 和 matrix[1][0] 互換,這樣做完之後,矩陣會看起來像是順時針旋轉了 90 度的效果。

  2. 反轉每一行: 將每行的元素順序反轉(從最左變到最右),這樣就完成了旋轉。

解題脈絡

這樣的解法非常巧妙,只需兩個步驟就完成了旋轉的效果,而且符合「就地旋轉」的要求,不需要額外的空間。

本次要點

  • 轉置 + 反轉:這兩步就能完成 90 度順時針旋轉。
  • 就地操作:直接對原始矩陣進行修改,符合題目要求。
  • 優雅簡潔:通過簡單的雙重循環實現複雜的視覺變換。

希望這篇解題思路能帶你一步步掌握 LeetCode 中的各種挑戰,接下來不妨試著自己動手,理解這樣的思考方式並用 Typescript 實現吧! 🚀


上一篇
Day06 X Leetcode:合併區間
下一篇
Day08 X Leetcode:二元樹的中序遍歷
系列文
TypeScript X Leetcode:精進演算法,掌握技術詞30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言