Idiot-maker

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

https://leetcode.com/problems/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].

解题思路:

看代码思路应该很清楚,就是不断的去打印最外层。但是下面两点必须注意。

if(top == bottom){
            return;
        }

必须要有,否则报错。因为第三个循环打印下边的时候又会打印2。

Input: [[2,3]]
Output: [2,3,2]
Expected: [2,3]
if(left == right){
            return;
        }

必须要有,否则报错。因为第四个循环打印左侧边的时候又会打印9。

Input: [[7],[9],[6]]
Output: [7,9,6,9]
Expected: [7,9,6]

 

public class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> result = new LinkedList<Integer>();
        if(matrix.length == 0){
            return result;
        }
        int left = 0, right = matrix[0].length - 1, top = 0, bottom = matrix.length - 1;
        while(left <= right && top <= bottom){
            spiralEdge(result, matrix, left, right, top, bottom);
            left++;
            right--;
            top++;
            bottom--;
        }
        return result;
    }
    
    public void spiralEdge(List<Integer> result, int[][] matrix, int left, int right, int top, int bottom){
        for(int i = left; i <= right; i++){
            result.add(matrix[top][i]);
        }
        if(top == bottom){
            return;
        }
        for(int i = top + 1; i <= bottom; i++){
            result.add(matrix[i][right]);
        }
        if(left == right){
            return;
        }
        for(int i = right - 1; i >= left; i--){
            result.add(matrix[bottom][i]);
        }
        for(int i = bottom - 1; i > top; i--){
            result.add(matrix[i][left]);
        }
    }
}

 或者

public class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> result = new LinkedList<Integer>();
        if(matrix.length == 0){
            return result;
        }
        int left = 0, right = matrix[0].length - 1, top = 0, bottom = matrix.length - 1;
        while(left <= right && top <= bottom){
            spiralEdge(result, matrix, left, right, top, bottom);
            left++;
            right--;
            top++;
            bottom--;
        }
        return result;
    }
    
    public void spiralEdge(List<Integer> result, int[][] matrix, int left, int right, int top, int bottom){
        //打印上边
        for(int i = left; i <= right; i++){
            result.add(matrix[top][i]);
        }
        //打印右边
        for(int i = top + 1; i <= bottom; i++){
            result.add(matrix[i][right]);
        }
        if(left == right || top == bottom){
            return;
        }
        //打印下边
        for(int i = right - 1; i >= left; i--){
            result.add(matrix[bottom][i]);
        }
        //打印左边
        for(int i = bottom - 1; i > top; i--){
            result.add(matrix[i][left]);
        }
    }
}

 

posted on 2015-03-19 11:03  NickyYe  阅读(150)  评论(0编辑  收藏  举报