贝壳找房 · 并查集 · 算法编程题
贝壳找房 并查集 时限 1 秒 / 256 MB

题目描述

青牛小学今天开学了,天真无邪的牛牛们都希望彼此之间做朋友
已知每只牛都有一些特长,如果两只牛的特长有交集,则他们会成为朋友。
同时牛牛们还喜欢把自己的朋友介绍给别人,即如果大牛和二牛是朋友,二牛和三牛是朋友,我们认为大牛和三牛也是朋友
牛牛们为了和别人交朋友,每次可以花费1桶牛奶学习一项特长
现在班主任想知道,最少需要花费多少桶牛奶才能让牛牛们都成为朋友

输入输出

输入描述
第一行两个整数N, M,表示牛的个数以及特长的个数
接下来N行,每行一个长度为M的0/1字符串,表示各个牛的特长
若第i行,第j列的字符为1,则表示第i只牛已经学会了第j项特长,若为0则表示未学会
输出描述
一个整数表示答案,若无解,则输出-1

样例共 2 组

样例 1 · 可以花两桶牛奶,让两只牛都学习特长1
输入
2 2
00
00
输出
2
样例 2 · 让奶牛2学习特长2即可
输入
5 4
0110
1001
0010
0100
1000
输出
1

算法解析依据充分

考点:并查集

限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:并查集

本题切入点

特长有交集即连通,用并查集求初始连通块数;再贪心地用最少的新增特长把所有连通块合并成一整块。

用「代表元」高效维护集合合并与连通性查询,均摊近 O(1)。

思路框架(并查集 通法 · 非本题专属)

  1. 初始化 parent[i] = i。
  2. find(x) 找根节点,路径压缩把链压平。
  3. union(x,y) 把两个根合并(按秩/大小合并更优)。
  4. 最终统计有几个不同的根,即有多少个连通块。

实现要点:路径压缩 + 按大小合并,复杂度近似 O(α(n))。

复杂度:时间 O(n α(n)) | 空间 O(n)

该范式的通法易错点

  • 只做路径压缩没做按秩合并,极坏情况下仍会退化。
  • 统计连通块时忘了再压缩一次根。

样例解读

样例 1:输入 2 2 / 00 / 00 → 输出 2

可以花两桶牛奶,让两只牛都学习特长1

样例 2:输入 5 4 / 0110 / 1001 / 0010 / 0100 / 1000 → 输出 1

让奶牛2学习特长2即可

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:贝壳找房2023届校招测试类试卷。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解