通过率 36% · 提交 855 · 通过 309
小明在直线的公路上种树,现在给定可以种树的坑位的数量和位置,以及需要种多少棵树苗,问树苗之间的最小间距是多少时,可以保证种的最均匀(两棵树苗之间的最小间距最大)
这类题属于华为 OD 机考真题方向中「200分 / 二分查找」方向的高频题型,通常考察对「200分 / 二分查找」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
输入三行:
第一行一个整数:坑位的数量
第二行以空格分隔的数组:坑位的位置
第三行一个整数:需要种植树苗的数量
树苗之间的最小间距
示例 1
输入示例
7 1 3 6 7 8 11 13 3
输出示例
6
三颗树苗分别种在 1、7、13 的位置,可以保证种的最均匀,树苗之间的最小间距为 6。如果选择最小间距为 7,则无法种下3颗树苗。
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
考虑最小种植间距 interval 与可种植树木数量之间的关系:
interval 越大的时候,在原列表 trees 中只能种下越少的树。当取到最值 interval = max(trees) - min(trees) 时,则只能在头尾种下 2 棵树,可种植树木数量为 2。interval 越小的时候,在原列表 trees 中可以种下越多的树。当取到最值 interval = 1 时,所有坑位都能种下树木,可种植树木数量为 `len(trees)`。对于在区间 [1, max(trees) - min(trees)] 之间取值的最小种植间距 interval 而言,一定存在一个值 `ans`,使得:
interval ∈ [1, ans] 时,可以种下 N 棵树。interval ∈ (ans, max(trees)] 时,不能种下 N 棵树。这体现了这个问题的二段性,ans 是我们需要的答案,而 ans 的寻找就可以用二分查找来完成。
故二分查找的框架为:
对于二分查找过程中得到的每一个最小种植间距 interval = mid,我们都要去判断在该间距的条件下 trees 数组能否成功种下 N 棵树。对于这个问题,我们可以用贪心的思路来解决:
trees 数组以升序排序,这样才能方便统计相邻坑位距离。pre_tree,那么对于当前树位置 cur_tree,当:cur_tree 和上一棵树 pre_tree 的距离大于等于最小种植间距 interval,我们种下当前树,种下树的总数 num 增加 1。同时,对于后面的树而言,当前树 cur_tree 成了其上一棵树,故修改上一棵树的变量 pre_tree = cur_tree。cur_tree 和上一棵树 pre_tree 的距离小于最小种植间距 interval,无法种下当前树,pre_tree 也无需做出任何修改。num 初始化为 1,同时初始化 pre_tree = trees[0] 即为第一棵树的位置。上述逻辑整理为代码即构建 check_available(interval, trees, N) 函数:
复杂度分析 设 M 为坑位数量(数组 trees 的长度),D 为首尾坑位的坐标差 trees[-1] - trees[0]。
因此总时间复杂度为 O(M log D):二分负责收缩间距取值,线性检查负责验证该间距下能否种满 N 棵树。空间上 check_available 只用 num、pre_tree 两个变量,加上二分的 left、right、mid,除输入数组外额外空间复杂度为 O(1)。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有