LeetCode-54.Spiral Matrix

来源:互联网 发布:小学生画画软件 编辑:程序博客网 时间:2024/06/06 06:52

一、问题描述

  1. 给定一个m*n的矩阵,返回从[0,0]开始的矩阵螺旋列表。
  2. 例如给定矩阵[ [1,2,3],[4,5,6],[7,8,9] ],返回列表内容为[1,2,3,6,9,8,7,4,5].

二、解题思路

  1. 两次循环,内层循环分别按照从左往右,从上到下,从右往左,从下到上的顺序添加到列表,外层循环则控制不断重复这四个内层循环,直到条件不满足退出循环。
  2. 设置边界数组board,board[0]存储上边界,board[1]存储下边界,board[2]存储左边界,board[3]存储有边界。i,j分别表示当前位置元素的横纵坐标。
  3. 例如从左往右添加元素时,当j==board[3]-1时,此时已经到了最右边的元素,添加完钙元素后需要将i++,跳出当前内层循环,开始从上到下循环。

三、代码

public class Solution {    public List<Integer> spiralOrder(int[][] matrix) {        List<Integer> result=new ArrayList<Integer>();        if(matrix==null || matrix.length==0)            return result;        int[] board=new int[4];        board[0]=-1;        board[1]=matrix.length;        board[2]=-1;        board[3]=matrix[0].length;        int i=0;        int j=0;        while((true)){            while(j<board[3]){                if(j==board[3]-1){                   result.add(matrix[i][j]);                   board[0]=board[0]+1;//上边界                   i++;                   break;                }                result.add(matrix[i][j]);                j++;            }            //因为退出循环前执行了i++,如果i超出边界,跳出外层循环。            if(i>=board[1])                break;            while(i<board[1]){                if(i==board[1]-1){                    result.add(matrix[i][j]);                    board[3]=board[3]-1;//有边界                    j--;                    break;                }                result.add(matrix[i][j]);                i++;            }            if(j<=board[2])                break;            while(j>board[2]){                if(j==board[2]+1){                    result.add(matrix[i][j]);                    board[1]=board[1]-1;//下边界                    i--;                    break;                }                result.add(matrix[i][j]);                j--;            }            if(i<=board[0])                break;            while(i>board[0]){                if(i==board[0]+1){                    result.add(matrix[i][j]);                    board[2]=board[2]+1;//左边界                    j++;                    break;                }                result.add(matrix[i][j]);                i--;            }            if(j>=board[3])                break;        }        return result;    }}