今天在看顺时针遍历数组的时候学到了新思路–旋转数组。
首先旋转数组的意思可以看下例:
1 | 2 | 3 |
---|---|---|
4 | 5 | 6 |
7 | 8 | 9 |
逆时针旋转90°后:
3 | 6 | 9 |
---|---|---|
2 | 5 | 8 |
1 | 4 | 7 |
即列变为行,行变为列。
public int[] revert(int[] matrix){
int rows=matrix.length;//行值
int cols=matrix[0].length;//列值
int[][] newMatrix=new int[cols][rows];//行列交换
for(int j=cols-1;i>=0;j++){
for(int i=0;i<rows;i++)
newMatrix[cols-1-j][i]=matrix[i][j];//第一行最后一个值赋给新数组的第一行第一个值
}
return newMatrix;
}
进一步,题目中要求的是顺时针遍历数组,例子:
1 | 2 | 3 |
---|---|---|
4 | 5 | 6 |
7 | 8 | 9 |
输出:
1 | 2 | 3 | 6 | 9 | 8 | 7 | 4 | 5 |
---|
结合旋转魔方的思想,我们可以这样:
1.访问第一行元素1 2 3,删除这一行
2.剩下的进行逆时针旋转,得到:
6 | 9 |
---|---|
5 | 8 |
4 | 7 |
3.访问第一行元素6 9,删除这一行,
4.剩下的进行旋转:
8 | 7 |
---|---|
5 | 4 |
5.同理,重复1,2步,访问8 7,删除这一行,旋转
4 |
---|
5 |
6.访问4,删除,旋转
5 |
---|
7.结束
代码
我们要完成顺时针遍历的话,要把上面的旋转魔方方法稍微调整一下,因为我们需要删除一行再进行旋转:
public int[] revert2(int[] matrix){
int rows=matrix.length;//行值
int cols=matrix[0].length;//列值
int[][] newMatrix=new int[cols][rows-1];//行列交换(删除一行,故列数减一)
for(int j=cols-1;i>=0;j++){
for(int i=1;i<rows;i++)//从第二行开始赋值
newMatrix[cols-1-j][i]=matrix[i][j];
}
return newMatrix;
}
接下来写主方法:
public static ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> list=new ArrayList<Integer>();
int rows=matrix.length;
while(rows!=0){
for(int i=0;i<matrix[0].length;i++)
list.add(matrix[0][i];
if(rows==1) break;//最后一行访问结束,无需再删除、旋转
matrix=revert2(matrix);
rows=matrix.length;
}
}
完