【LeetCode热题100】--54.螺旋矩阵

54.螺旋矩阵

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

【LeetCode热题100】--54.螺旋矩阵_第1张图片

按层遍历

可以将矩阵看成若干层,首先输出最外层的元素,其次输出次外层的元素,直到输出最内层的元素。

对于每层,从左上方开始以顺时针的顺序遍历所有元素,假设当前层的左上角位于(top,left),右下角位于(bottom,right),按照如下顺序遍历当前层的元素

1.从左到右遍历上侧元素,依次为(top,left)到(top,right)

2.从上到下遍历右侧元素,依次为(top+1,right)到(bottom,right)

3.如果left

遍历完当前层的元素之后,将left和top分别加1,将right和bottom分别减1,进入下一层继续遍历,直到遍历完所有元素为止。

【LeetCode热题100】--54.螺旋矩阵_第2张图片

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<Integer>();
        if(matrix == null|| matrix.length == 0 || matrix[0].length == 0){
            return res;
        }
        int rows = matrix.length,columns = matrix[0].length;
        int left = 0,right = columns -1,top = 0,bottom = rows-1;
        while(left<=right && top<=bottom){
            for(int column = left;column<=right;column++){
                res.add(matrix[top][column]); //从左到右
            }
            for(int row = top + 1;row<=bottom;row++){
                res.add(matrix[row][right]);  //从上到下
            }
            if(left < right && top <bottom){
                for(int column = right -1;column > left;column--){
                    res.add(matrix[bottom][column]);  //从右到左
                }
                for(int row = bottom;row > top;row--){
                    res.add(matrix[row][left]); //从下到上
                }
            }
            left++;
            right--;
            top++;
            bottom--;
        }
        return res;

    }
}

看到一个巧妙的解法:使用旋转数组

  public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        while (matrix.length>=1){
            for (int num : matrix[0]) {
                res.add(num);
            }
            matrix=reversalArr(matrix);
        }
        return res;
    }
    private int[][] reversalArr(int[][] matrix) {
        int m = matrix[0].length;
        int n = matrix.length - 1;
        int[][] reArr = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                reArr[i][j]=matrix[j+1][m-i-1];
            }
        }
        return reArr;
    }

你可能感兴趣的:(LeetCode,leetcode,算法)