刷题记录|目标101题--图

写在前面

开个贴记录一下 刷题的过程,目前参照 leetcode101,目标101题,由于太久没写java了,也会涉及到一些java的基础用法,希望能和大家共勉吧~

已刷链接:

数据结构介绍

二分图

No.1  Graph Bipartite?

题目链接:https://leetcode.com/problems/is-graph-bipartite/

解题思路:

利用队列和广度优先搜索,我们可以对未染色的节点进行染色,并且检查是否有颜色相同的 相邻节点存在。注意在代码中,我们用 0 表示未检查的节点,用 1 2 表示两种不同的颜色。

class Solution {
    public boolean isBipartite(int[][] graph) {
        int len = graph.length;
        int[] color = new int[len];
        Queue<Integer> que = new LinkedList<Integer>();
        for (int i = 0; i < len; i++) {
            if (color[i] == 0) {
                color[i] = 1;
                que.offer(i);
            }
            while(que.size() != 0) {
                int cur = que.poll();
                for (int j = 0; j < graph[cur].length; j++) {
                    int neighbor = graph[cur][j];
                    if (color[neighbor] == 0) {
                        color[neighbor] = color[cur] == 1 ? 2 : 1;
                        que.offer(neighbor);
                    } else if (color[neighbor] == color[cur]) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
}

拓扑排序

No.1 Course Schedule II

题目链接:https://leetcode.com/problems/course-schedule-ii/

解题思路:

用 map 建立一个有向图,找到入度为 0 的点放入queue中进行遍历,每遍历一个点把他指向的点的入度-1,

class Solution {
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        Map<Integer, List<Integer>> graph = new HashMap<Integer, List<Integer>>();
        int[] indegree = new int[numCourses];
        int[] res = new int[numCourses];
        for (int[] prerequisite : prerequisites) {
            int src = prerequisite[1];
            int end = prerequisite[0];
            indegree[end]++;
            List<Integer> list = graph.getOrDefault(src,new ArrayList<Integer>());
            list.add(end);
            graph.put(src,list);
        }
        Queue<Integer> que = new LinkedList<Integer>();
        for (int i = 0; i < numCourses; i++) {
            if (indegree[i] == 0) {
                que.add(i);
            }
        }
        int i = 0;
        while(que.size() != 0) {
            int cur = que.poll();
            res[i++] = cur;
            if (graph.containsKey(cur)) {
                List<Integer> list = graph.get(cur);
                for(int temp : list) {
                    indegree[temp]--;
                    if (indegree[temp] == 0) {
                        que.offer(temp);
                    }
                }
            }
        }
        if (i == numCourses) {
            return res;
        }
        return new int[0];
    }
}

#逃离互联网##刷题#
全部评论

相关推荐

03-30 19:30
石家庄学院 Java
野蛮的柯基在游泳:都能入股了,还得是Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务