【剑指offer】顺时针打印矩阵

顺时针打印矩阵

http://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a

很扎心,看了一会讨论和题解,没看到一个用标记数组写的...

  1. 随便画图可知,走的方向dir有规律:向右->向下->向左->向上->向右->向下->向左->... 是一个圆圈
  2. 判断哪一步是否可以走,首先,它没越界;其次,它没被走过(vis标记数组,为false代表没走过)
import java.util.ArrayList;

public class Solution {

    // 走的方向:向右、向下、向左、向上
    private final int[] dx = {0, 1, 0, -1};
    private final int[] dy = {1, 0, -1, 0};

    public ArrayList<Integer> printMatrix(int[][] matrix) {
        int n = matrix.length, m = matrix[0].length;
        boolean[][] vis = new boolean[n][m];
        ArrayList<Integer> list = new ArrayList<>();

        int x = 0, y = 0, dir = 0;
        while (x >= 0 && x < n && y >= 0 && y < m && !vis[x][y]) {
            list.add(matrix[x][y]);
            vis[x][y] = true;

            // 试着继续向dir的方向走
            while (x + dx[dir] >= 0 && x + dx[dir] < n && y + dy[dir] >= 0 && y + dy[dir] < m && !vis[x + dx[dir]][y + dy[dir]]) {
                x += dx[dir];
                y += dy[dir];
                list.add(matrix[x][y]);
                vis[x][y] = true;
            }
            // 走不动了换方向
            dir = (dir + 1) % 4;
            x += dx[dir];
            y += dy[dir];
        }
        return list;
    }
}
全部评论
把迷宫问题套用到这里,很不错啊,学以致用
2 回复
分享
发布于 2020-01-31 16:59
跟我想的一样
1 回复
分享
发布于 2020-02-17 16:08
联想
校招火热招聘中
官网直投
费空间
点赞 回复
分享
发布于 2019-11-16 14:31
嗯嗯 这个方法我觉得是最好想且最好写的。
点赞 回复
分享
发布于 2019-11-18 00:55
一开始的那两个数组存的代表什么意思呀,小白,请教一下,谢谢
点赞 回复
分享
发布于 2020-02-15 22:23
思路挺秒的!就是稍稍多费了一些空间。
点赞 回复
分享
发布于 2020-10-21 17:06

相关推荐

61 6 评论
分享
牛客网
牛客企业服务