[LeetCode每日一题 旋转矩阵 ] | 刷题打卡

353 阅读1分钟

题目描述

给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。

不占用额外内存空间能否做到?

示例 1:

给定 matrix = 
[
 [1,2,3],
 [4,5,6],
 [7,8,9]
],

原地旋转输入矩阵,使其变为:

[
 [7,4,1],
 [8,5,2],
 [9,6,3]
] 

解题思路

目标阵列的每一横列为对应原始阵列每一竖列倒序

题解一:


/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var rotate = function(matrix) {
    let N = matrix.length;
   	let newM = []
    for (let i = 0; i < N; i++) {
        newM[i] = Array.from(matrix[i]);
    }
    for (let i = 0; i < N; i++) {
        for(let j = 0; j < N; j++) {
            matrix[i][j] = newM [N - j - 1][i]; 
        }
    }
};

题解二:不创建新的数组空间


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

总结

事实上这种方法是取巧了的,数组扩容了。数组检测到需要扩容时,就会开辟新的内存空间,最终大小为1.5倍+16。当数组内存空间>=length*2+16的时候会进行缩容。如果数组长度比之前缩短了1,则只回收多余容量的一半,若长度比之前缩小的更多,则全部回收多余容量。


本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情