一道典型的LC数组题
题目要求原地顺时针旋转90度, 一开始就联想到了矩阵的转置,但是矩阵的转置是沿着对角线交换而非旋转。
解法一:
但是在纸上演算,发现转置后,沿着矩阵的中线 按列对称交换刚好是旋转90度。
个人觉得实现难度小 且能击败100%
class Solution {
public void rotate(int[][] matrix) {
//转置
for (int i = 0; i < matrix.length; i++) {
for (int j = i; j < matrix[0].length; j++) {
if(i!=j) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
//沿中线按列交换 其实就是逆序而已别想的太高大上
for (int i = 0; i < matrix.length; i++) {
int l=0,r=matrix.length-1;
while(l<r) {
int temp = matrix[i][l];
matrix[i][l] = matrix[i][r];
matrix[i][r] = temp;
l++;
r--;
}
}
}
}
解法二:
当然其实如果只是单纯的面试想过题,暴力法也也是不错的选择,以下是代码是官方题解
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
int[][] matrix_new = new int[n][n];
//创建一个新数组 , 按列遍历(矩阵是n*n,按行遍历交换i j位置即可), 逆序复制到新数组中
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
matrix_new[j][n - i - 1] = matrix[i][j];
}
}
//把新数组中的数据 复制到原来的数组中去
//一手掩耳盗铃就可以骗过判题系统而且击败100%
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
matrix[i][j] = matrix_new[i][j];
}
}
}
}
解法三:
看到题目是旋转后直接联想到到了之前的一题 环路交换题,本题相对简单,以一个元素开始的旋转必定是4次,从外到内 一圈一圈的旋转。
官方题解上有,这个代码我自己也不是很懂就不贴了,有兴趣的可以看官方题解
算法记录贴, 不是自己写的代码都有说明,算法新手,代码有问题欢迎指正!