[抄题]:
Given an undirected graph
, return true
if and only if it is bipartite.
Recall that a graph is bipartite if we can split it's set of nodes into two independent subsets A and B such that every edge in the graph has one node in A and another node in B.
The graph is given in the following form: graph[i]
is a list of indexes j
for which the edge between nodes i
and j
exists. Each node is an integer between 0
and graph.length - 1
. There are no self edges or parallel edges: graph[i]
does not contain i
, and it doesn't contain any element twice.
Example 1: Input: [[1,3], [0,2], [1,3], [0,2]] Output: true Explanation: The graph looks like this: 0----1 | | | | 3----2 We can divide the vertices into two groups: {0, 2} and {1, 3}.
Example 2: Input: [[1,2,3], [0,2], [0,1,3], [0,2]] Output: false Explanation: The graph looks like this: 0----1 | | | | 3----2 We cannot find a way to divide the set of nodes into two independent subsets.
[暴力解法]:
时间分析:
空间分析:
[优化后]:
时间分析:
空间分析:
[奇葩输出条件]:
[奇葩corner case]:
需要考虑非连通图的情况,此时无法染色 语言:
!validColor(graph, colors, 0, i)
[思维问题]:
如果valid函数中有染色, 那主函数就不用再染 直接用valid函数即可
[一句话思路]:
双色问题的本质是BFS
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
- 理解下:下一个节点是用其index i表示的
[二刷]:
- “已经染色”用color[i] != -1来表示,同时检查一下有没有染对
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
如果valid函数中有染色, 那主函数就不用再染 直接用valid函数即可
[复杂度]:Time complexity: O(n^2) Space complexity: O(n^2)
[英文数据结构或算法,为什么不用别的数据结构或算法]:
初始化数组:
Arrays.fill(nums, -1);
[算法思想:递归/分治/贪心]:贪心
[关键模板化代码]:
public boolean validColor(int[][] graph, int[] colors, int color, int node) { //already colored,color again if (colors[node] != -1) return colors[node] == color; //color 1, then bfs colors[node] = color; for (int next : graph[node]) { if (!validColor(graph, colors, 1 - color, next)) return false; } return true; }
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
[代码风格] :
class Solution { public boolean isBipartite(int[][] graph) { //cc: null if (graph == null || graph.length == 0) return false; //ini: colors[] -1 int n = graph.length; int[] colors = new int[n]; Arrays.fill(colors, -1); //for loop: not connected graph for (int i = 0; i < n; i++) { if (colors[i] == -1 && !validColor(graph, colors, 0, i)) return false; } return true; } public boolean validColor(int[][] graph, int[] colors, int color, int node) { //already colored,color again if (colors[node] != -1) return colors[node] == color; //color 1, then bfs colors[node] = color; for (int next : graph[node]) { if (!validColor(graph, colors, 1 - color, next)) return false; } return true; } }