1. 程式人生 > 其它 >2021-01-10 | 48. 旋轉影象

2021-01-10 | 48. 旋轉影象

技術標籤:2021 LeetCode每日一題演算法LeetCodejsJavaScript

1. 題目描述

給定一個 n × n 的二維矩陣表示一個影象。
將影象順時針旋轉 90 度。

說明:
你必須在原地旋轉影象,這意味著你需要直接修改輸入的二維矩陣。請不要使用另一個矩陣來旋轉影象。

示例 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] ]

2. 解題思路

對於這個矩陣,我們可以先沿著左上角到右下角對角線進行翻轉,在沿著垂直的中心進行對稱。

// 初始的矩陣
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
]
//(1)沿著左上角到右下角對角線進行翻轉
[
  [1,4,7],
  [2,5,8],
  [3,6,9]
]
//(2)沿著垂直的中心進行對稱
[ [7,4,1], [8,5,2], [9,6,3] ]

複雜度分析

  • 時間複雜度:O(n),其中 n 是 matrix 的邊長。對於每一次翻轉操作,我們都需要列舉矩陣中一半的元素。
  • 空間複雜度:O(1)。為原地翻轉得到的原地旋轉。

3. 程式碼實現

/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var rotate = function(matrix) {
    const n = matrix.length
    for
(let i = 0; i < n; i++){ for(let j = i; j < n; j++){ [matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]] } } for(let k = 0; k < n; k++){ for(let l = 0; l < Math.floor(n/2); l++){ [matrix[k][l], matrix[k][n-1-l]] = [matrix[k][n-1-l], matrix[k][l]] } } };

4. 提交結果

在這裡插入圖片描述