LeetCode--54. Spiral Matrix

来源:互联网 发布:硬座火车座位图片知乎 编辑:程序博客网 时间:2024/05/16 17:55

Problem:

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].Subscribe to see which companies asked this question

Analysis:

题目理解:    将一维或二维数组中的元素按顺时针放向进行打印;解题分析:    1. 模拟;    2. 递归:    1)每次重新计算最开始的左上初始点;    2)然后依此遍历最上一行,最右一列,最后一行,以及最左一行;    3)注意避免重复遍历,处理好边界问题;

Answer:
递归解法:

public class Solution {    public List<Integer> spiralOrder(int[][] matrix) {        List<Integer> list = new ArrayList<Integer>();        if(matrix.length==0 || matrix[0].length==0) return list;        int m = matrix.length, n = matrix[0].length;        spiral_print(0,m-1,0,n-1,matrix,list);        return list;    }    public static void spiral_print(int row_start,int row_end,int col_start,int col_end,int[][] matrix,List<Integer> list){        if (row_start>row_end || col_start>col_end) return;        for(int i=col_start;i<=col_end;i++){            list.add(matrix[row_start][i]);        }        if(row_start+1>row_end) return;        for(int i=row_start+1;i<=row_end;i++){            list.add(matrix[i][col_end]);        }        if(col_start+1>col_end) return;        for(int i=col_end-1;i>=col_start;i--){            list.add(matrix[row_end][i]);        }        for(int i=row_end-1;i>row_start;i--){            list.add(matrix[i][col_start]);        }        spiral_print(row_start+1,row_end-1,col_start+1,col_end-1,matrix,list);    }}

迭代解法:

public class Solution {public List<Integer> spiralOrder(int[][] matrix) {        List<Integer> result = new ArrayList<Integer>();        if(matrix.length == 0) return result;        int left=0,right=matrix[0].length-1,top=0,bottom=matrix.length-1,direction=0;        while(left <= right && top <= bottom){            if(direction == 0){                for(int i=left;i<= right;i++){                    result.add(matrix[top][i]);                }                top++;            }            else if(direction == 1){                for(int i=top;i<=bottom;i++){                    result.add(matrix[i][right]);                }                right--;            }            else if(direction == 2){                for(int i=right;i>=left;i--){                    result.add(matrix[bottom][i]);                }                bottom--;            }            else if(direction == 3){                for(int i=bottom;i>=top;i--){                    result.add(matrix[i][left]);                }                left++;            }            direction=(direction+1) % 4;        }    return result;}}
0 0
原创粉丝点击