题目是给一个矩阵,再给一个flag,顺时针或者逆时针旋转矩阵。
在leetcode中有一道类似的题目,rotate image。不过leetcode的题目中的矩阵是正方形,也给定了是顺时针旋转的。
理清楚思维其实这道题就想出来了。
| 0 | 1 | 2 | |
| 0 | 1 | 2 | 3 |
| 1 | 5 | 6 | 7 |
例如这么一个矩阵,变为
| 0 | 1 | |
| 0 | 3 | 7 |
| 1 | 2 | 6 |
| 2 | 1 | 5 |
或者
| 0 | 1 | |
|---|---|---|
| 0 | 5 | 1 |
| 1 | 6 | 2 |
| 2 | 7 | 3 |
这么的一个过程。
用长宽创建一个新的矩阵,对应数字放进去就可以了。我的程序中假定用户非常的友好,给的flag除了0,1不会输入其他的。这个也不是问题就是了。
private static int[][] rotate(int[][] matrix, int flag) {
// TODO Auto-generated method stub
if(matrix==null)
return matrix;
if(matrix.length < 2 && matrix[0].length < 2 )
return matrix;
int width = matrix[0].length;
int height = matrix.length;
int[][] newM = new int[width][height];
if(flag == 1)
{
newM = clockwise(matrix);
}else
{
newM = counterclockwise(matrix);
}
return newM;
}
private static int[][] counterclockwise(int[][] matrix) {
int width = matrix[0].length;
int height = matrix.length;
int[][] newM = new int[width][height];
int h = 0;
int w = width-1;
for(int i=0; i < height; i++)
{
for(int j=0; j < width; j++)
{
newM[j][i] = matrix[h][w];
w --;
}
if(w < 0)
w = width-1;
h ++;
if(h > height)
h = 0;
}
return newM;
}
private static int[][] clockwise(int[][] matrix) {
// TODO Auto-generated method stub
int width = matrix[0].length;
int height = matrix.length;
int[][] newM = new int[width][height];
int h = height;
int w = 0;
for(int i=0; i < height; i++)
{
for(int j=0; j < width; j++)
{
newM[j][i] = matrix[h-1][w];
w += 1;
}
if(w >= width)
w = 0;
h --;
if(h < 0)
h = height-1;
}
return newM;
}
本文介绍了一种实现矩阵顺时针或逆时针旋转的算法。通过创建新的矩阵并将原矩阵元素按旋转规则放置到新矩阵中,实现了不同方向的旋转。适用于非正方形矩阵。
3110

被折叠的 条评论
为什么被折叠?



