现在的位置: 首页 > 综合 > 正文

leetcode——Spiral Matrix

2017年12月22日 ⁄ 综合 ⁄ 共 1435字 ⁄ 字号 评论关闭

题目:

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].

思路:

该题属于模拟题,意图在于对二维数组的操作控制。

首先定义方向,并定义边界。对于题目中的例子,每个方向的运动情况如下图:

按此顺序进行添加。注意:1、m可能会不等于n;

                                            2、m=n时,有两种可能,分奇数和偶数,奇数的时候,需要留意中间那个最后的数字跟运动方向上边界的关系。

AC代码:

public List<Integer> spiralOrder(int[][] matrix) {
        int curDir = 0;
        List<Integer> rst = new LinkedList<Integer>();
        if(matrix==null || matrix.length==0)
            return rst;
        int m = matrix.length;
        int n = matrix[0].length;
        int totalNum = m*n;
        if(m<=1){
            for(int j = 0;j<n;j++)
                rst.add(matrix[0][j]);
            return rst;
        }
        else if(n<=1){
            for (int[] aMatrix : matrix) {
                rst.add(aMatrix[0]);
            }
            return rst;
        }

        int[] fourConer = new int[4];
        fourConer[0]  = n-1;
        fourConer[1] = m-1;
        fourConer[2] = 0;
        fourConer[3] = 0;
        int count = 0;
        int i;
        int beginx = 0;
        int beginy = 0;
        while(count<totalNum){
            if(curDir==0){
                if(beginx==beginy && count==totalNum-1){
                    rst.add(matrix[beginx][beginy]);
                    break;
                }
                for(i=beginy;i<fourConer[curDir];i++){
                    rst.add(matrix[beginx][i]);
                    count++;

                }
                beginy = i;
                fourConer[curDir] = i-1;
            }
            if(curDir==1){
                for(i=beginx;i<fourConer[curDir];i++){
                    rst.add(matrix[i][beginy]);
                    count++;

                }
                beginx = i;
                fourConer[curDir] = i-1;
            }
            if(curDir==2){
                for(i=beginy;i>fourConer[curDir];i--){
                    rst.add(matrix[beginx][i]);
                    count++;

                }
                beginy = i;
                fourConer[curDir] = i+1;
            }
            if(curDir==3){
                for(i=beginx;i>fourConer[curDir];i--){
                    rst.add(matrix[i][beginy]);
                    count++;

                }
                beginx = i+1;
                beginy++;
                fourConer[curDir] = i+1;

            }
            curDir = (curDir+1)%4;
        }
        return rst;
    }

抱歉!评论已关闭.