[算法]旋转矩阵问题(Spiral Matrix)
题目一:
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
You should return [1,2,3,6,9,8,7,4,5]
.
解答:
采用从最外层一层一层向内操作的方法。
public class Solution { public List<Integer> spiralOrder(int[][] matrix) { List<Integer> res = new ArrayList<>(); if(matrix==null||matrix.length==0||matrix[0].length==0) return res; //每一圈左上角数字的坐标为(top,left),右下角的数字的坐标为(bottom,right) int top = 0, left = 0; int bottom = matrix.length - 1, right = matrix[0].length - 1; while (top <= bottom && left <= right) { outEdge(res, matrix, left++, top++, right--, bottom--); } return res; } private static void outEdge(List<Integer> res, int[][] matrix, int left, int top, int right, int bottom) { if (top == bottom) { for (int i = left; i <= right; i++) { res.add(matrix[top][i]); } } else if (left == right) { for (int i = top; i <= bottom; i++) { res.add(matrix[i][left]); } } else { int curRow = top; int curCol = left; while (curCol < right) { res.add(matrix[top][curCol++]); } while (curRow < bottom) { res.add(matrix[curRow++][right]); } while (curCol > left) { res.add(matrix[bottom][curCol--]); } while (curRow > top) { res.add(matrix[curRow--][left]); } } } }
题目二:
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3
,
You should return the following matrix:
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
public static int[][] generateMatrix(int n) { int[][] res = new int[n][n]; int top = 0, left = 0; int bottom = n - 1, right = n - 1; int num = 1; while (left<=right&&top<=bottom) { num= inputEdge(num, res, left++, top++, right--, bottom--); } return res; } private static int inputEdge(int num, int[][] res, int left, int top, int right, int bottom) { int curRow = top; int curCol = left; if (top==bottom&&left==right){ res[top][left]=num; return num; } while (curCol < right) { res[top][curCol++] = num++; } while (curRow < bottom) { res[curRow++][right] = num++; } while (curCol > left) { res[bottom][curCol--] = num++; } while (curRow > top) { res[curRow--][left] = num++; } return num; }