每日力扣-可能的二分法

82 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。

题目(已做删减处理)

给定一组 n 人(编号为 1, 2, ..., n), 我们想把每个人分进任意大小的两组。每个人都可能不喜欢其他人,那么他们不应该属于同一组。给定整数 n 和数组 dislikes ,其中 dislikes[i] = [ai, bi] ,表示不允许将编号为 ai 和  bi的人归入同一组。当可以用这种方法将所有人分进两组时,返回 true;否则返回 false

分析

本题主要考察的是有关二分图的相关知识点:如果将每个人看做图中的节点,相互讨厌的关系看做图中的边,那么 dislikes 数组就可以构成一幅图。我们假设第一组中的人为红色,第二组中的人为蓝色。那么我们可以得到以下的分析:

  • 如果当前的人没有分组,那么就分到第一组里;
  • 对应的,将上述第一组中的不喜欢的人分到第二组中。
  • 对应的,将上述第一组中的不喜欢的人分到第一组中。
  • ....

在遍历过程中,我们可以以此类推,如果在遍历过程中,如果存在冲突,那么就意味着这个任务是无法完成的,我们返回false即可。相反的,我们返回true,证明任务是可以完成的。

总结

这是一道不常见的有关二分图的算法题目。如果你刷过《剑指offer》这本书,那么你可能对此比较熟悉。二分图的解答,我们一般用深度或者是广度搜索来处理。一道中等难度的二分图算法题,我的建议是大家可以深入学习一下。不仅仅是因为二分图也是数据结构中的重要知识点之一,更重要的是,它涉及到了广度 or 深度优先搜索的知识点。能够多知识一起结合学习。

结题证明

image.png