二维数组6:数组的水平翻转
Posted 纵横千里,捭阖四方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二维数组6:数组的水平翻转相关的知识,希望对你有一定的参考价值。
数组翻转就是将数组整体做顺/逆时针旋转90度或者180度,由于旋转180就是对称,没啥难度,所以常见的题目还是以旋转90度比较多。
LeetCode的48题就是这样的题目:有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于300。
这个题有多种处理方式,我们分别来看:
1 一层一层循环,坐标变换
还是定义三个位置,一圈写一轮的元素位置变化,比如A移动到B,B移动到C,C移动到D,那么另tmp=D,就可以先将C移动到D,然后将B移动到C,再将B移动到B,最后将tmp赋值给A,一圈圈进行,这里也要非常小心边界的判断:
import java.util.*;
public class Solution {
public int[][] rotateMatrix(int[][] mat, int n) {
int tR=0;
int tC=0;
int dR=n-1;
int dC=n-1;
while(tR<dR){
for(int i=0;i<dC-tC;i++){
int tmp=mat[tR][tC+i];
mat[tR][tC+i]=mat[dR-i][tC];
mat[dR-i][tC]=mat[dR][dC-i];
mat[dR][dC-i]=mat[tR+i][dC];
mat[tR+i][dC]=tmp;
}
tR++;
tC++;
dR--;
dC--;
}
return mat;
}
}
2 根据数学规律进行
mat[i]被旋转到了mat[j]的位置是有数学公式可以用的,如果知道的话就可以直接写代码了:
import java.util.*;
public class Rotate {
public int[][] rotateMatrix(int[][] mat, int n) {
// write code here
int[][] temp=new int[n][n];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
temp[j][n-1-i]=mat[i][j];
}
}
return temp;
}
}
这种方式我觉得并不适合在面试的时候说,首先很明显除非提前知道公式,否则很难在面试的时候找到这个规律。
更尴尬的是,如果快速将上面的代码写出来了,面试官肯定知道你刷过了,所以很可能会再找个算法题让你做,郁闷不?
3 两次翻转法
先沿右上-左下的对角线翻转,再沿水平中线上下翻转。即对于函数中的一个点,先以y=x为轴作对称,然后以x轴作对称,则相当于该点顺时针旋转90°。所以对于图像来说每个点顺时针旋转了,则图也旋转了。所以可以将图以对角线作对称,然后以中间的横线作对称。
这个还比较好写的:
import java.util.*;
public class Rotate {
public int[][] rotateMatrix(int[][] mat, int n) {
// write code here
// 对角线
for(int i=0; i<n;i++) {
for(int j=i+1; j< n; j++) {
int temp = mat[i][j];
mat[i][j] = mat[j][i];
mat[j][i] = temp;
}
}
// 以横轴翻转
for(int i=0;i<n;i++) {
for(int j=0; j< n/2; j++) {
int temp = mat[i][j];
mat[i][j] = mat[i][n-1-j];
mat[i][n-1-j] = temp;
}
}
return mat;
}
}
以上是关于二维数组6:数组的水平翻转的主要内容,如果未能解决你的问题,请参考以下文章
Python使用numpy函数hsplit水平(按列)拆分numpy数组(返回拆分后的numpy数组列表)实战:水平(按列)拆分二维numpy数组split函数水平(按列)拆分二维numpy数组