一、二维数组的转置
1.1 对n*n的矩阵
int n = matrix.length;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
1.2 对n*m的矩阵
int[][] res = new int[matrix[0].length][matrix.length];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
res[j][i] = matrix[i][j];
}
}
二、对二维矩阵上下翻转
int n = matrix.length;
for (int i = 0; i < n / 2; i++) {
int[] temp = matrix[i];
matrix[i] = matrix[n - 1 - i];
matrix[n - 1 - i] = temp;
}
三、二维矩阵顺时针螺旋遍历
public class SpiralOrder {
public static List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<Integer>();
//当二维数组是空或任何一个维度是0,直接返回
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return list;
}
//m是矩阵的行数
int m = matrix.length;
//n是矩阵的列数
int n = matrix[0].length;
//大循环,从外向内逐层遍历矩阵
for(int i=0; i<(Math.min(m, n)+1)/2; i++) {
//从左到右遍历“上边”
for (int j=i; j<n-i; j++) {
list.add(matrix[i][j]);
}
//从上到下遍历“右边”
for (int j=i+1; j<m-i; j++) {
list.add(matrix[j][(n-1)-i]);
}
//从右到左遍历“下边”
for (int j=i+1; j<n-i; j++) {
list.add(matrix[(m-1)-i][(n-1)-j]);
}
//从下到上遍历“左边”
for (int j=i+1; j<m-1-i; j++) {
list.add(matrix[(m-1)-j][i]);
}
}
return list;
}
public static void main(String[] args) {
int[][] matrix = {
{ 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9, 10 },
{ 11, 12, 13, 14, 15 },
{ 16, 17, 18, 19, 20 }
};
int[][] matrix2 = {
{ 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9, 10 },
{ 11, 12, 13, 14, 15 },
{ 16, 17, 18, 19, 20 },
{ 21, 22, 23, 24, 25 }
};
List<Integer> resultList1 = spiralOrder(matrix);
System.out.println(Arrays.toString(resultList1.toArray()));
List<Integer> resultList2 = spiralOrder(matrix2);
System.out.println(Arrays.toString(resultList2.toArray()));
}
}
四、二维矩阵逆时针螺旋遍历
对二维矩阵的逆时针螺旋便利就是对这个二维矩阵的转置后矩阵顺时针遍历
public static void main(String[] args) {
int[][] matrix = new int[][] {
{ 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9, 10 },
{ 11, 12, 13, 14, 15 },
{ 16, 17, 18, 19, 20 }
};
// 转置二维矩阵
int[][] res = new int[matrix[0].length][matrix.length];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
res[j][i] = matrix[i][j];
}
}
// 对转置后的矩阵进行顺时针螺旋便利
List<Integer> list = new ArrayList<Integer>();
//m是矩阵的行数
int m = res.length;
//n是矩阵的列数
int n = res[0].length;
//大循环,从外向内逐层遍历矩阵
for(int i=0; i<(Math.min(m, n)+1)/2; i++) {
//从左到右遍历“上边”
for (int j=i; j<n-i; j++) {
list.add(res[i][j]);
}
//从上到下遍历“右边”
for (int j=i+1; j<m-i; j++) {
list.add(res[j][(n-1)-i]);
}
//从右到左遍历“下边”
for (int j=i+1; j<n-i; j++) {
list.add(res[(m-1)-i][(n-1)-j]);
}
//从下到上遍历“左边”
for (int j=i+1; j<m-1-i; j++) {
list.add(res[(m-1)-j][i]);
}
}
for (int i = 0; i < res.length; i++) {
for (int j = 0; j < res[i].length; j++) {
System.out.print(res[i][j] + " ");
}
System.out.println();
}
for (Integer integer : list) {
System.out.print(integer + " ");
}
}