当前位置:首页 > 未命名 > 正文内容

【解题报告】lintcode374螺旋矩阵

u3blog8年前 (2016-05-14)未命名243

题意

螺旋遍历一个矩阵,方向为,右,下,左,上,如此循环

解法

用一个与原数组相同的标记数组来标记已经访问的点,再设置四个函数,处理四种方向的情况,循环调用这四个函数。

代码

public class Solution {
    /**
     * @param matrix a matrix of m x n elements
     * @return an integer list
     */
        int[][] flags;
    int[][] values;
    List<Integer>  mList;

    public List<Integer> spiralOrder(int[][] matrix) {
        // Write your code here
        int  x = matrix.length;
        if (x == 0)
            return new ArrayList<>();
        int  y = matrix[0].length;
        if (matrix == null||(x == 0&&y == 0))
            return mList;
        values = matrix;
        mList = new ArrayList<>();

        flags = new int[x][y];
        int i = 0,j = -1;

        while (mList.size() < matrix.length*matrix[0].length){
            j = right(i,j+1);
            i = down(i+1,j);
            j = left(i,j-1);
            i = up(i-1,j);
        }
        return mList;
    }
    private int right(int i,int j){
        while (j < flags[0].length){
            if (flags[i][j] != 0){
                j--;
                break;
            }
            mList.add(values[i][j]);
            flags[i][j] = 1;
            j++;
        }
        if (j >= flags[0].length)
            j--;
        return j;
    }
    private int down(int i,int j){
       while (i < flags.length){
            if (flags[i][j] != 0){
                i--;
                break;
            }
            mList.add(values[i][j]);
             flags[i][j] = 1;
           i++;
        }
        if (i >= flags.length)
            i--;
        return i;
    }
    private int left(int i,int j){
            while (j >= 0){
            if (flags[i][j] != 0){
                j++;
                break;
            }
            mList.add(values[i][j]);
            flags[i][j] = 1;
            j--;
        }
        if (j<0)
            j = 0;
        return j;
    }
    private int up(int i,int j){
            while (i >= 0) {
                if (flags[i][j] != 0) {
                    i++;
                    break;
                }
                mList.add(values[i][j]);
                flags[i][j] = 1;
                i--;
            }
        if (i < 0)
            i = 0;
        return i;
    }
}

扫描二维码推送至手机访问。

版权声明:本文由u3blog发布,如需转载请注明出处。

本文链接:https://u3blog.xyz/?id=397

分享给朋友:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。