JAVA程序设计:可能的二分法(LeetCode:886)

给定一组 N 人(编号为 1, 2, ..., N), 我们想把每个人分进任意大小的两组。

每个人都可能不喜欢其他人,那么他们不应该属于同一组。

形式上,如果 dislikes[i] = [a, b],表示不允许将编号为 a 和 b 的人归入同一组。

当可以用这种方法将每个人分进两组时,返回 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]
对于 dislikes[i] == dislikes[j] 不存在 i != j 

思路:这题如果你想着如何拼凑两个集合中分别应该有哪些元素的话问题会变得比较复杂,因此我们考虑什么时候使得无论怎么分都不满足条件的情况,并且该情况能够判定是否能够构成两个满足条件的集合。

       我们可以考虑一种简单的情况:A和B不能分一组,B和C不能分一组,C和A不能分一组,此时我们会发现,无论如何都不能分出来两个集合装进去这是哪个元素,而对于A和B不能分一组,B和C不能分一组,C和D不能分一组,D和A不能分一组的情况,我们发现可以将他们相邻的岔开分别放在两组:(1)A,C放一组;(2)B,D放一组。

        进一步推广,我们会发现只要是满足1不喜欢2,2不喜欢3......n不喜欢1并且n为奇数时,无论如何都无法满足题意,因此我们将问题转化为在无向图中判断是否存在奇数环的问题。

class Solution {
	
	int[] val;
	boolean flag;
	List> list=new ArrayList<>();
	
    public boolean possibleBipartition(int N, int[][] dislikes) {
    	
    	flag=false;
    	val=new int[N+1];
    	
    	for(int i=0;i<=N;i++)
    		list.add(new ArrayList<>());
    	
    	for(int i=0;i

 

你可能感兴趣的:(JAVA程序设计:可能的二分法(LeetCode:886))