首页 > 其他分享 >数组操作の旋转二维数组

数组操作の旋转二维数组

时间:2022-10-01 23:31:58浏览次数:72  
标签:arr return matrix 复杂度 矩阵 旋转 二维 let 数组

一、题目描述:

​旋转图像​

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 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]]

数组操作の旋转二维数组_数组_02

二、思路与实现:

从示例图中就可以知道:

数组顺时针旋转 90 度之后,其实就是第1列变成第1行,第2列变成第2行,第3列变成第3行......

实现一:

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

时间复杂度:O(N^2),其中N为matrix的边长 空间复杂度:O(N^2)。我们需要使用一个和 matrix 大小相同的辅助数组。

还有另外一种思路:

  1. 按照左上到右下的对角线进行镜像对称
  2. 对矩阵的每一行进行反转

比如这样:

数组操作の旋转二维数组_二维_03

/**
* @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 = i; j < n; j++) {
[matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]];
}
}
const reverseRow = (arr) => {
let i = 0,
j = arr.length - 1;
while (i <= j) {
[arr[i], arr[j]] = [arr[j], arr[i]];
i++;
j--;
}
};
// 然后反转二维矩阵的每一行
for (let row of matrix) {
reverseRow(row);
}
return matrix;
};
  • 时间复杂度跟解法1一样,但是却不需要额外的空间复杂度

三、总结:

本题考察的是对数组的操作熟练度;实现二(镜像反转)比实现一更优,减少了空间复杂度~ 真牛哇~~

标签:arr,return,matrix,复杂度,矩阵,旋转,二维,let,数组
From: https://blog.51cto.com/u_13961087/5728537

相关文章

  • 机试题 三数之和变形-三数和赛高数组01
    数组a对任意的i、j、k都能找到l,使得ai+aj+ak=al,那么这个数组就是被称为三数和赛高数组,特别的i、j、k需要满足(1<=i<j<k<=n,1<=l<=n)。输入:首先t(1......
  • 机试题 三数之和变形-三数和赛高数组02 存在
    数组a存在i、j、k能找到l,使得ai+aj+ak=al,那么这个数组就是被称为三数和赛高数组,特别的i、j、k需要满足(1<=i<j<k<=n,1<=l<=n)。输入:首先t(1<=......
  • 稀疏数组
    稀疏数组packagearray;importjava.util.Arrays;publicclassSparse{publicstaticvoidmain(String[]args){//创建二维数组System.out.p......
  • Java 数组
    1.数组的定义数组是相同类型数据的有序集合。数字描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作数组元素,每一个数组元素可以通过......
  • 树状数组+dfs
    P3605[USACO17JAN]PromotionCountingP-洛谷|计算机科学教育新生态(luogu.com.cn)这是一棵树,首先想到了dfs,但是数据范围大,所以不能单纯用dfs想到每个结点只跟他的......
  • 带有旋转效果的提交按钮 - 仅限 CSS - 一步一步
    带有旋转效果的提交按钮-仅限CSS-一步一步HTML对于HTML,我们需要一个带有文本和“检查”svg元素的按钮。我们将显示文本并隐藏svg。在按钮焦点上,我们将显示sv......
  • java数组
    java数组数组概述  数组声明创建      for语句快速语句:数组.length.for   数组使用内存分析    数组打印快捷键数组名.for......
  • 【Numpy总结】第三节:Numpy创建数组
    一、标准数组的创建1.1numpy.empty创建空数组用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组;由于未初始化,所以数组中的数据是随机的;numpy.empty(shape,dt......
  • 数组和内存分析
    数组什么是数组数组是相同数据类型数据的集合,且数组中的数据具有先后次序每一个数据称为一个数组元素,每一个元素可以通过下标访问声明和定义声明:不需要分配内存......
  • 如何使用Java代码修改数组大小呢?
    转自:http://www.java265.com/JavaJingYan/202111/16357342581649.html数组是Java开发中非常重要的一个数据存储容器,那可以存储多种类型,基础类型,引用类型,但是它有一个缺......