刷题记录|目标101题--图
写在前面
开个贴记录一下 刷题的过程,目前参照 leetcode101,目标101题,由于太久没写java了,也会涉及到一些java的基础用法,希望能和大家共勉吧~
已刷链接:
- 贪心算法:https://www.nowcoder.com/discuss/1051877
- 双指针:https://www.nowcoder.com/discuss/1057237
- 二分查找:https://www.nowcoder.com/discuss/1059986
- 排序:https://www.nowcoder.com/discuss/1063581
- 搜索:https://www.nowcoder.com/discuss/1069407
- 动态规划:https://www.nowcoder.com/discuss/1071676
- 分治法:https://www.nowcoder.com/discuss/1091335
- 链表:https://www.nowcoder.com/discuss/post/419235544456052736
- 树:https://www.nowcoder.com/discuss/post/424955068647997440
- 位运算:https://www.nowcoder.com/discuss/post/427247596613230592
数据结构介绍
二分图
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]; } }#逃离互联网##刷题#