【LeetCode】旋转矩阵
一、问题
给你一幅由 N × N
矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 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]
]
二、思路与题解
1. 思路
旋转矩阵的思路其实开始的时候画画图表,因为要求的是不能使用额外内存空间,所以我们这边不考虑再初始化一个新的额外的二维数组,那另外的想法就是原地交换两个值,当然这边暂时使用一个 temp 来记录临时值(当然违背了题目的意思,等以后想到更好的办法再处理)。
在纸上画数组旋转的过程中,一开始就惯性思路的直接把每个位置进行90度旋转,到最后发现代码无法写出来,后来才知道其实是自己把画图的步骤给跳过了。
比如在下面错误的画图流程中,直接从第一步跳到了第二步。后来发现,其实是中间少了一个过程。在正确画图的过程中,我们就能根据步骤正确的将代码编写出来了。
其实主要思路就是两个元素互相交换,具体为什么第二步一定要是左右元素互换,也只是尝试以后得出的结果,当然可以使用上下交换也一样。
- 错误画图:
[
[0x0, 0x1, 0x2, 0x3],
[1x0, 1x1, 1x2, 1x3],
[2x0, 2x1, 2x2, 2x3],
[3x0, 3x1, 3x2, 3x3],
]
[
[3x0, 2x0, 1x0, 0x0],
[3x1, 2x1, 1x1, 0x1],
[3x2, 2x2, 1x2, 0x2],
[3x3, 2x3, 1x3, 0x3],
]
- 正确画图:
[
[0x0, 0x1, 0x2, 0x3],
[1x0, 1x1, 1x2, 1x3],
[2x0, 2x1, 2x2, 2x3],
[3x0, 3x1, 3x2, 3x3],
]
[
[0x3, 0x2, 0x1, 0x0],
[1x3, 1x2, 1x1, 1x0],
[2x3, 2x2, 2x1, 2x0],
[3x3, 3x2, 3x1, 3x0],
]
[
[3x0, 2x0, 1x0, 0x0],
[3x1, 2x1, 1x1, 0x1],
[3x2, 2x2, 1x2, 0x2],
[3x3, 2x3, 1x3, 0x3],
]
2. 题解
public class Test4 {
public static void main(String[