leetcode886.PossibleBipartition
转自:https://blog.csdn.net/QingyunAlgo/article/details/82106963
题目: 有N个人,编号从1到N。现在我们试图把他们分成两组。一个人可能不喜欢某些人,那么这个人和他不喜欢的人不能分到一组。输入一个数组dislikes,数组的第i项dislikes[i] = [a, b]表示编号为a的人不喜欢编号为b的人,因此他们不能分到同一组。请根据dislikes关系判断输入的N个人能否分到两个组里?
输入: N个人,一个二维数组 dislikes
输出:true or false
别人思路: 要想解决这个问题,首先我们要发现这个题目是关于图的问题。每个人是图中的一个节点。如果一个人a不喜欢另一个人b,那么a与b之间有一条边相连。在这个题目中a不喜欢b意味着a、b不能分到同一组。不管b是否不喜欢a,只要a不喜欢b他们就不能放在同一组里。因此这个图是无向图。如果看成有向图,只要从a到b有一条边,那么从b到a也有一条边。
如果这些人能够分成两组,我们可以想象这些人在图中对应的节点能够用两种颜色标记。分到第一组的人用颜色c1标记,另一组的人用颜色c2标记。接着我们考虑怎么给图中每个节点标记颜色。
最开始的时候每个节点都没有标记颜色。我们逐个扫描图中的节点,如果发现一个节点p没有被标记过颜色,那么给他标记颜色c1。接着我们看这个节点p都有哪些节点和它相邻,如果相邻的节点q之前没有标记过颜色,我们给它们标记成c2。这是因为p和q相邻,表示他们之间相互不喜欢,不能分在同一组,因此不能用相同的颜色标记。如果节点q之前已经被标记过颜色了,那么看之前标记的是什么颜色。如果之前标记的是c2,那么没有必要再重复标记了。如果之前标记的颜色是c1,那么出现冲突了,一个人不能分到两个组里,因此我们不能按照这个分组规则把所有人分成两组。
接下来我们再从节点q出发去,把和它相邻的节点标记颜色c1,再以此类推。这就是一个深度优先搜索的过程。下面是基于图的深度优先搜索的参考代码:
class Solution {public boolean possibleBipartition(int N, int[][] dislikes) {HashMap<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>() ;int key ;for(int i=1;i<=N;i++){List<Integer> list = new ArrayList<Integer>() ;map.put(i, list) ;}for(int i=0;i<dislikes.length;i++){key = dislikes[i][0] ;map.get(key).add(dislikes[i][1]) ;if(!map.get(dislikes[i][1]).contains(key)){map.get(dislikes[i][1]).add(key) ;}}int colors[] = new int[N+1] ;Arrays.fill(colors, -1);for(int i=1;i<=N;i++){if(colors[i] == -1 && !dfs(map, colors, i, 0)){return false ;}}return true ;}public boolean dfs(Map<Integer, List<Integer>> map, int colors[], int index, int value){if(colors[index] != -1){return colors[index] == value ;}colors[index] = value ;int len = map.get(index).size() ;for(int i=0;i<len;i++){if(!dfs(map, colors, map.get(index).get(i), 1-value)){return false ;}}return true ;}
}
leetcode886.PossibleBipartition相关推荐
- Acwing LeetCode 题目分类——配套基础课进阶课
LeetCode 题目分类--配套基础课进阶课 1.基础 二分(满足一个条件的最值问题) LeetCode33 https://leetcode.com/problems/search-in-rota ...
- LeetCode 886. 可能的二分法(着色DFS/BFS/拓展并查集)
文章目录 1. 题目 2. 解题 2.1 DFS 2.2 BFS 2.3 并查集 1. 题目 给定一组 N 人(编号为 1, 2, -, N), 我们想把每个人分进任意大小的两组. 每个人都可能不喜欢 ...
- Leetcode —— 886. 可能的二分法
给定一组 N 人(编号为 1, 2, -, N), 我们想把每个人分进任意大小的两组. 每个人都可能不喜欢其他人,那么他们不应该属于同一组. 形式上,如果 dislikes[i] = [a, b],表 ...
- 清华大学尹成 怎么样
清华大学尹成 怎么样 编程能力极强,算法能力极强,业界的最强算法王者 ============================================================= 清华 ...
- 并查集(Union-Find)
并查集(Union-Find) 并查集(Union-Find) 1.初始化 2.查询 3.合并 4.平衡性优化,扁平化 5.按秩合并 6.路径压缩 7.代码 常用模板 [★ 547. 省份数量](ht ...
- LeetCode中的那些题
目录 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 *******4.寻找两个有序数组的中位数(官方解答) : 5.最长回文子串(官方解答) 15. 三数之和 16. 最接近的三数之和 ...
- leetcode 转载
转载: https://blog.csdn.net/love905661433/article/details/84980135 LeetCode 1- 100 1. 两数之和 : https://b ...
- LeedCode 思维训练(二)
给你一个字符串 s,它由数字('0' - '9')和 '#' 组成.我们希望按下述规则将 s 映射为一些小写英文字符: 字符('a' - 'i')分别用('1' - '9')表示. 字符('j' - ...
- 【Leetcode】每日一题打卡(64)
1619. 删除某些元素后的数组均值 - 简单ac class Solution { public:double trimMean(vector<int>& arr) {sort( ...
最新文章
- 模型大十倍,性能提升几倍?谷歌研究员进行了一番研究
- AI实时特效,魔幻修图,Adobe Photoshop相机拯救PS菜鸟
- 台湾大学林轩田机器学习基石课程学习笔记10 -- Logistic Regression
- java.lang.IllegalStateException: Not connected to serve
- java 模拟http文件上传,HttpURLConnection上传多文件
- DCMTK:OFpath和相关内容的测试程序
- 指令篇: 查看系统版本信息___uname
- win7旗舰版6l打印机咋安驱动_在w7旗舰版上怎么安装HPlaserjet6L打印机?
- js关于浅拷贝、深拷贝,数组的深拷贝
- Redis和MongoDB的区别
- django中ForeignKey指向自身的方法
- 【多多情报通】拼多多个人店铺怎么升级为企业店铺?怎么转让?
- Echarts风向玫瑰图
- 为什么c语言运行后输入的中文会乱码
- r语言导入spss数据_R软件导入数据_r语言怎么导入数据_R软件导入数据
- 杰理之录音详细流程框图【篇】
- 谈谈Java的学习方法
- 记录一下之前写的文章--测试之不可承受之轻
- 三级数据库知识点学习(五)
- 【论文笔记_自蒸馏_2020】Regularizing Class-wise Predictions via Self-knowledge Distillation
热门文章
- python学习--面向过程程序设计实例
- vim - multiple windows
- MySQL 主从复制与读写分离概念及架构分析
- [转]Python中多线程与多进程中的数据共享问题!
- 熬夜做出的数据可视化,却被领导臭骂,只因这个......
- 去掉源代码里的debug标致
- Adobe Flex UIComponent LifeCycle
- c++ 全局变量_专业解码 | 带你了解Python全局变量与局部变量!
- java进入dos_java启动dos命令收集笔记一
- vue里面的mvvm双向绑定(高级语法糖)