剑指offer - 顺时针打印矩阵(Java实现)

题目链接:https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a?tpId=13&&tqId=11172&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

  思路:按照题意模拟,首先我们向右走,先判断向右走一个是否会越界和右边的点是否是我们走过的点,如果不会越界则我们就向右走,然后把我们已经走过的这个点进行标记。如果下一步不能在进行移动,此时我们就需要换方向向下走,同理,如果下一个点不能走了,我们就往左走和往上走,如果某一个方向上下一个点可以到达,我们就对当前点进行标记,然后走向下一个点。当最后我们站在某一个点上发现四个方向都不能走的时候,此时我们当前点就是最后一个点,我们跳出循环即可。

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       int n = matrix.length, m = matrix[0].length;
        boolean[][] vis = new boolean[n][m];
        for(int i = 0; i < n; ++ i) {
            for(int j = 0; j < m; ++ j) vis[i][j] = false;
        }
        ArrayList<Integer> list = new ArrayList<>();
        int x = 0, y = 0, ans = 0;
        while(!vis[x][y]) {
            while(y + 1 < m && !vis[x][y + 1]) {
                list.add(matrix[x][y]);
                vis[x][y] = true;
                ++ y; ++ ans;
            }
            while(x + 1 < n && !vis[x + 1][y]) {
                list.add(matrix[x][y]);
                vis[x][y] = true;
                ++ x; ++ ans;
            }
            while(y - 1 >= 0 && !vis[x][y - 1]) {
                list.add(matrix[x][y]);
                vis[x][y] = true;
                -- y; ++ ans;
            }
            while(x - 1 >= 0 && !vis[x - 1][y]) {
                list.add(matrix[x][y]);
                vis[x][y] = true;
                -- x; ++ ans;
            }
            if(ans == n * m - 1) break;
        }
        list.add(matrix[x][y]);
        return list;
    }
}
【剑指offer】题目全解 文章被收录于专栏

本专栏主要是刷剑指offer的题解记录

全部评论

相关推荐

爱吃肉的伊登在写日记:好棒,27届简历能做成这个样子,但是第一个项目感觉cover住难度还是不小的,特别是二面的时候肯定要对分布式系统设计这一块儿有高出正常面试者的水平才行
点赞 评论 收藏
分享
04-08 13:31
已编辑
门头沟学院 前端工程师
D0cC:京东营收1万多亿人民币,阿里9000多亿,虽然他俩利润都没腾讯和字节多,但是很恐怖了啊,负担了多少打工人的薪水
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务