LeetCode 886. 可能的二分法(着色DFS/BFS/拓展并查集)
文章目錄
- 1. 題目
- 2. 解題
- 2.1 DFS
- 2.2 BFS
- 2.3 并查集
1. 題目
給定一組 N 人(編號(hào)為 1, 2, …, N), 我們想把每個(gè)人分進(jìn)任意大小的兩組。
每個(gè)人都可能不喜歡其他人,那么他們不應(yīng)該屬于同一組。
形式上,如果 dislikes[i] = [a, b],表示不允許將編號(hào)為 a 和 b 的人歸入同一組。
當(dāng)可以用這種方法將每個(gè)人分進(jìn)兩組時(shí),返回 true;否則返回 false。
示例 1: 輸入:N = 4, dislikes = [[1,2],[1,3],[2,4]] 輸出:true 解釋:group1 [1,4], group2 [2,3]示例 2: 輸入:N = 3, dislikes = [[1,2],[1,3],[2,3]] 輸出:false示例 3: 輸入:N = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]] 輸出:false提示: 1 <= N <= 2000 0 <= dislikes.length <= 10000 1 <= dislikes[i][j] <= N dislikes[i][0] < dislikes[i][1] 對(duì)于 dislikes[i] == dislikes[j] 不存在 i != j來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/possible-bipartition
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
2. 解題
- 把人分成2組,組內(nèi)沒(méi)有自己不喜歡的人
2.1 DFS
著色法,初始顏色均為0,著色成1或者2,遇到矛盾的返回 false
class Solution {unordered_map<int,unordered_set<int>> m;bool ans = true; public:bool possibleBipartition(int N, vector<vector<int>>& dislikes) {if(dislikes.size() <= 2) return true;vector<int> color(N+1, 0);for(auto& d : dislikes)//建圖{m[d[0]].insert(d[1]);m[d[1]].insert(d[0]);}for(int i = 1; i <= N; i++){if(color[i] == 0)//未著色的{color[i] = 1;//著色為1dfs(i, 1, color);if(!ans)return false;}}return true;}void dfs(int id, int col, vector<int> &color){if(!ans) return;int nextcol = col==1 ? 2 : 1;//跟我相連的(不喜歡的人)顏色相反for(auto it = m[id].begin(); it != m[id].end(); it++){if(color[*it] == col)//顏色相同,出錯(cuò)ans = false;if(color[*it] == 0)//沒(méi)有訪問(wèn)過(guò)的,繼續(xù)著色{color[*it] = nextcol;dfs(*it, nextcol, color);}}} };528 ms 71.3 MB
2.2 BFS
- 思路跟dfs一樣,實(shí)現(xiàn)形式不一樣而已
524 ms 70.9 MB
2.3 并查集
- 參考 數(shù)據(jù)結(jié)構(gòu)–并查集(Disjoint-Set)
類(lèi)似題目:
LeetCode 684. 冗余連接(并查集)
LeetCode 990. 等式方程的可滿(mǎn)足性(并查集)
LeetCode 959. 由斜杠劃分區(qū)域(并查集)
LeetCode 1202. 交換字符串中的元素(并查集)
LeetCode 1319. 連通網(wǎng)絡(luò)的操作次數(shù)(BFS/DFS/并查集)
程序員面試金典 - 面試題 17.07. 嬰兒名字(并查集)
參考了題解區(qū)大佬們的思路
- 把并查集大小開(kāi)到2倍的N,左邊是自己的顏色,右邊是自己不喜歡的另一種顏色
- 當(dāng)a,b互斥時(shí),a 與 b 對(duì)應(yīng)的相反顏色 b+N 應(yīng)該是一致的,進(jìn)行merge(a, b+N)
- 同理,merge(b, a+N)
256 ms 39.6 MB
總結(jié)
以上是生活随笔為你收集整理的LeetCode 886. 可能的二分法(着色DFS/BFS/拓展并查集)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LeetCode 895. 最大频率栈(
- 下一篇: LeetCode 457. 环形数组循环