2022-12-21 Daily Challenge
Today I have done leetcode's December LeetCoding Challenge with cpp
.
December LeetCoding Challenge 21
Description
Possible Bipartition
We want to split a group of n
people (labeled from 1
to n
) into two groups of any size. Each person may dislike some other people, and they should not go into the same group.
Given the integer n
and the array dislikes
where dislikes[i] = [ai, bi]
indicates that the person labeled ai
does not like the person labeled bi
, return true
if it is possible to split everyone into two groups in this way.
Example 1:
Input: n = 4, dislikes = [[1,2],[1,3],[2,4]] Output: true Explanation: group1 [1,4] and group2 [2,3].
Example 2:
Input: n = 3, dislikes = [[1,2],[1,3],[2,3]] Output: false
Example 3:
Input: n = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]] Output: false
Constraints:
1 <= n <= 2000
0 <= dislikes.length <= 104
dislikes[i].length == 2
1 <= dislikes[i][j] <= n
ai < bi
- All the pairs of
dislikes
are unique.
Solution
class Solution {
vector<vector<int>> dislike;
public:
bool possibleBipartition(int N, vector<vector<int>>& dislikePairs) {
dislike.resize(N+1);
for(auto &pair : dislikePairs) {
dislike[pair[0]].push_back(pair[1]);
dislike[pair[1]].push_back(pair[0]);
}
vector<int> group(N+1, -1);
while(true) {
queue<int> q;
for(int i = 1; i <= N; ++i) {
if(group[i] == -1) {
q.push(i);
group[i] = 0;
break;
}
}
if(q.empty()) break;
while(!q.empty()) {
int current = q.front();
q.pop();
for(auto dis : dislike[current]) {
if(group[dis] != -1 && group[dis] == group[current]) return false;
if(group[dis] == -1) q.push(dis);
group[dis] = group[current] ^ 1;
}
}
}
return true;
}
};
// Accepted
// 70/70 cases passed (472 ms)
// Your runtime beats 40.43 % of cpp submissions
// Your memory usage beats 75.45 % of cpp submissions (64.7 MB)