[算法]旋转矩阵问题(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;
    }
posted @ 2016-01-29 21:03  小魔仙  阅读(1354)  评论(0编辑  收藏  举报