给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 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]
]
一、这道题目熟系矩阵的朋友们可以很轻易的做出来
将矩阵求其转置,再进行交换列的位置即可
二、不熟悉矩阵的朋友也别慌,我们还有一种办法,那就是找规律,我们画下图,然后找4个点,观察他们移动 的规律
package Test2017;
public class rotate {
// 旋转90度等于,矩阵转置加上调换个列即可
public void rotate(int[][] matrix) {
int n = matrix.length;
// 转置
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
int k = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = k;
}
}
// 再翻转列
int mid = 0;
if (n % 2 == 0)
mid = n / 2;
else
mid = n / 2 + 1;
for (int i = 0, j = n - 1; i <= mid - 1 && j >= mid; i++, j--) {
for (int k = 0; k < n; k++) {
int temp = matrix[k][i];
matrix[k][i] = matrix[k][j];
matrix[k][j] = temp;
}
}
}
// 观察规律法,四点法
public void rotate2(int[][] matrix) {
int temp = -1;
for (int start = 0, end = matrix[0].length - 1; start < end; start++, end--) {
for (int s = start, e = end; s < end; s++, e--) {
temp = matrix[start][s];
matrix[start][s] = matrix[e][start];
matrix[e][start] = matrix[end][e];
matrix[end][e] = matrix[s][end];
matrix[s][end] = temp;
}
}
}
}
下面第54题,这两道题目,异曲同工之妙。
一起学习吧。
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
这道题目的思路很直接,就是顺时针遍历即可。
上方遍历n-1个
右边n-1个
下边n-1个
左边n-2个
终止的条件是列表中的元素数目等于矩阵的数目即可。
代码如下:
package Test2017;
import java.util.ArrayList;
import java.util.List;
public class spiralO {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<Integer>();
int m = matrix.length;
int n = matrix[0].length;
int num = 0, count = 0;
while (count < m * n) {
if (count == m * n - 1) {
break;
}
int x = num;
for (; x < n - 1 - num; x++) {// 上
list.add(matrix[num][x]);
count++;
}
int y1 = x;
int y = num;
for (; y < m - 1 - num; y++) {// 右
list.add(matrix[y][y1]);
count++;
}
int z1 = y;
int z = x;
for (; z > num; z--) {// 下
list.add(matrix[z1][z]);
count++;
}
int u1 = z;
int u = y;
for (; u > num; u--) {// 左
list.add(matrix[u][u1]);
count++;
}
num++;
}
if (count == (m * n - 1)) {
list.add(matrix[m / 2][n / 2]);
count++;
}
while (count != m * n) {
list.remove(count - 1);//去重
count--;
}
return list;
}
public List<Integer> spiralOrder2(int[][] matrix) {
List ans = new ArrayList();
if (matrix.length == 0)
return ans;
int r1 = 0, r2 = matrix.length - 1;// 行
int c1 = 0, c2 = matrix[0].length - 1;// 列
while (r1 <= r2 && c1 <= c2) {
for (int c = c1; c <= c2; c++)
ans.add(matrix[r1][c]);// 上边
for (int r = r1 + 1; r <= r2; r++) {
ans.add(matrix[r][c2]);// 右边
}
if (r1 < r2 && c1 < c2) {
for (int c = c2 - 1; c > c1; c--)
ans.add(matrix[r2][c]);// 下边
for (int r = r2; r > r1; r--)
ans.add(matrix[r][c1]);// 左边
}
r1++;
r2--;
c1++;
c2--;// 向内部收缩
}
return ans;
}
public static void main(String[] args) {
int[][] a = { { 1, 2, 3 } };
spiralO s = new spiralO();
List<Integer> l = s.spiralOrder2(a);
for (int o : l) {
System.out.println(o);
}
}
}