持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。
题目(已做删减处理)
给定一组
n人(编号为1, 2, ..., n), 我们想把每个人分进任意大小的两组。每个人都可能不喜欢其他人,那么他们不应该属于同一组。给定整数n和数组dislikes,其中dislikes[i] = [ai, bi],表示不允许将编号为ai和bi的人归入同一组。当可以用这种方法将所有人分进两组时,返回true;否则返回false。
分析
本题主要考察的是有关二分图的相关知识点:如果将每个人看做图中的节点,相互讨厌的关系看做图中的边,那么 dislikes 数组就可以构成一幅图。我们假设第一组中的人为红色,第二组中的人为蓝色。那么我们可以得到以下的分析:
- 如果当前的人没有分组,那么就分到第一组里;
- 对应的,将上述第一组中的不喜欢的人分到第二组中。
- 对应的,将上述第一组中的不喜欢的人分到第一组中。
- ....
在遍历过程中,我们可以以此类推,如果在遍历过程中,如果存在冲突,那么就意味着这个任务是无法完成的,我们返回false即可。相反的,我们返回true,证明任务是可以完成的。
总结
这是一道不常见的有关二分图的算法题目。如果你刷过《剑指offer》这本书,那么你可能对此比较熟悉。二分图的解答,我们一般用深度或者是广度搜索来处理。一道中等难度的二分图算法题,我的建议是大家可以深入学习一下。不仅仅是因为二分图也是数据结构中的重要知识点之一,更重要的是,它涉及到了广度 or 深度优先搜索的知识点。能够多知识一起结合学习。