LeetCode1030. 距离顺序排列矩阵单元格-Java&Go-BFS

  • 算法
    • 1.广度优先搜素
    • 2.队列实现广度优先搜索,visited数组记录已访问坐标
public int[][] allCellsDistOrder(int R, int C, int r0, int c0) {
    int[][] result = new int[R*C][2];
    int i = 0;

    boolean[][] visited = new boolean[R][C];
    visited[r0][c0] = true;

    Queue<int[]> queue = new LinkedList<>();
    queue.offer(new int[]{r0, c0});
    while (!queue.isEmpty()) {
        int size = queue.size();
        while (size-- > 0) {
            int[] curr = queue.poll();
            result[i++] = curr;
            if (curr[0] - 1 >= 0 && !visited[curr[0]-1][curr[1]]) {
                queue.offer(new int[]{curr[0]-1, curr[1]});
                visited[curr[0]-1][curr[1]] = true;
            }
            if (curr[0] + 1 < R && !visited[curr[0]+1][curr[1]]) {
                queue.offer(new int[]{curr[0]+1, curr[1]});
                visited[curr[0]+1][curr[1]] = true;
            }
            if (curr[1] - 1 >= 0 && !visited[curr[0]][curr[1]-1]) {
                queue.offer(new int[]{curr[0], curr[1]-1});
                visited[curr[0]][curr[1]-1] = true;
            }
            if (curr[1] + 1 < C && !visited[curr[0]][curr[1]+1]) {
                queue.offer(new int[]{curr[0], curr[1]+1});
                visited[curr[0]][curr[1]+1] = true;
            }
        }
    }
    return result;
}
func allCellsDistOrder(R int, C int, r0 int, c0 int) [][]int {
    result := make([][]int, R * C)
    i := 0

    visited := make([][]bool, R)
    for i := range visited {
        visited[i] = make([]bool, C)
    }
    visited[r0][c0] = true

    l := list.New()
    l.PushBack([]int{r0, c0})
    for l.Len() > 0 {
        size := l.Len()
        for size > 0 {
            curr := l.Remove(l.Front())
            p := curr.([]int)
            result[i] = p
            i++
            if p[0] - 1 >= 0 && !visited[p[0] - 1][p[1]] {
                l.PushBack([]int{p[0] - 1, p[1]})
                visited[p[0] - 1][p[1]] = true
            }
            if p[0] + 1 < R && !visited[p[0] + 1][p[1]] {
                l.PushBack([]int{p[0] + 1, p[1]})
                visited[p[0] + 1][p[1]] = true
            }
            if p[1] - 1 >= 0 && !visited[p[0]][p[1] - 1] {
                l.PushBack([]int{p[0], p[1] - 1})
                visited[p[0]][p[1] - 1] = true
            }
            if p[1] + 1 < C && !visited[p[0]][p[1] + 1] {
                l.PushBack([]int{p[0], p[1] + 1})
                visited[p[0]][p[1] + 1] = true
            }
            size--
        }
    }
    return result
}
LeetCode题解 文章被收录于专栏

测试

全部评论

相关推荐

04-02 22:40
已编辑
电子科技大学 后端
谢谢大家啦!!!
坚定的芭乐反对画饼_许愿Offer版:有鹅选鹅,没鹅延毕
点赞 评论 收藏
分享
02-22 20:28
重庆大学 Java
程序员牛肉:首先不要焦虑,你肯定是有希望的。 首先我觉得你得好好想一想自己想要什么。找不到开发岗就一定是失败的吗?那开发岗的35岁危机怎么说?因此无论是找工作还是考公我觉得你都需要慎重的想一想。但你一定要避开这样一个误区:“我是因为找不到工作所以不得不选择考公”。 千万不要这么想。你这个学历挺好的了,因此你投后端岗肯定是有面试机会的。有多少人简历写的再牛逼,直接连机筛简历都过不去有啥用?因此你先保持自信一点。 以你现在的水平的话,其实如果想要找到暑期实习就两个月:一个月做项目+深挖,并且不断的背八股。只要自己辛苦一点,五月份之前肯定是可以找到暑期实习的,你有点太过于高看大家之间的技术差距了。不要焦虑不要焦虑。 除此之外说回你这个简历内容的话,基本可以全丢了。如果想做后端,先踏踏实实做两个项目再说+背八股再说。如果想考公,那就直接备战考公。 但是但是就像我前面说的:你考公的理由可以是因为想追求稳定,想追求轻松。但唯独不能是因为觉得自己找不到工作。不能这么小瞧自己和自己的学历。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务