螺旋矩阵的遍历

54. 螺旋矩阵

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

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100
  • class Solution {
        public List spiralOrder(int[][] matrix) {
            Listres = new ArrayList();
            if(matrix==null||matrix.length==0||matrix[0].length==0){
                return res;
            }
            int rows = matrix.length;
            int columns = matrix[0].length;
            int total = rows*columns;
            int row=0,column=0;
            boolean[][]seen = new boolean[rows][columns];
            int[][]directions = {{0,1},{1,0},{0,-1},{-1,0}};
            int directionindex = 0;
            for(int i=0;i=rows||next_column<0||next_column>=columns||seen[next_row][next_column]){
                    directionindex = (directionindex+1)%4;
                }
                row += directions[directionindex][0];
                column+= directions[directionindex][1];
            }
            return res;
        }
    }

    遍历次数为矩阵的元素个数,因此,再用一个数组seen来表示是否遍历过该元素,每次遍历完一个元素时,将这个位置设定为true,如果该元素遍历过,则调整方向,方向数组direction为一个4*2的数组,4行表示上下左右四个方向,两列表示行变换和列变换,列表示方向的递增递减不动,分别用1,-1,0表示,当我们遍历完第i行,第j列元素时,我们将下个元素的行和列表示出来,next_row = row + directions[directionindex][0],next_column = column + directions[directionindex][1];

  • 如果下个元素的行列越界,或者是下个要访问的位置已经被设定为true,那么我们将它+1再模4。

  • 将行和列更新,进入下一次循环

  • 循环total次后,返回

补充一下n*n形状的螺旋矩阵,输入一个n,返回n行n列的螺旋矩阵,例如,输入5,返回

螺旋矩阵的遍历_第1张图片

下面是代码:

import java.util.Scanner;
public class dwa {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][]res = new int[n][n];
        //行列都为n
        int totals = n*n;
        int[][]direction = {{0,1},{1,0},{0,-1},{-1,0}};
        int directionIndex = 0;
        int cnt = 0;
        int row = 0;
        int column = 0;
        boolean[][]seen = new boolean[n][n];
        for(int i=0;i=n||next_column<0||next_column>=n||seen[next_row][next_column]){
                directionIndex = (directionIndex+1)%4;
            }
            row += direction[directionIndex][0];
            column += direction[directionIndex][1];
        }
        for(int i=0;i

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