# 第 2 节 「力扣」上一类问题的特点(极其重要)

这一节的内容非常重要,只有知道了问题的本质,才能理解「模板」到底是怎么回事。请大家一定仔细挖掘「力扣」第 34 题、第 35 题和第 69 题的特点,这三道问题非常典型。

下面这段描述非常重要,需要结合本节给出的例题(「力扣」第 34 题、第 35 题和第 69 题)进行理解: 「力扣」上有一些问题具有这样的特点。问题的答案可能是 mid 位置的值。具体来说,mid 是不是问题的答案,由 mid 的左边或者右边是否存在答案决定:

  • 如果 mid 的左边(或者右边)不存在答案,那么 mid 就是我们要找的问题的答案;
  • 如果 mid 的左边(或者右边)存在答案,那么 mid 不是我们要找的问题的答案。

说明:上面两句话读起来比较拗口,可以结合例题来理解。到底左边还是右边,题目都会给答案,到时候认真看题就可以。

上面的描述比较晦涩,我们给大家举一些「力扣」上的例子进行说明。

# 例 1:「力扣」第 34 题:在排序数组中查找元素的第一个和最后一个位置

(由于标题本身就表示了题目的意思,在这里就不贴题目描述了。)

「力扣」第 34 题,要求我们找:有序整数数组里第 1 个等于 target 的位置和最后 1 个等于 target 的位置

分析:如果当前 mid 看到的元素就等于 ,此时不能确定 就是数组当中第 1 次出现的位置。如果我们知道 的左边没有 ,オ可以确定此时 mid 是「数字 第 1 次出现的位置」。 但可以确定的是: 的右边一定不是「数字 第 1 次出现的位置」。

  • 大家可以看看上面的图,再结合本节一开始「下面这段描述非常重要,需要结合给出的例题进行理解」进行理解;
  • 解决这个问题一种常见的做法是:看到 以后,继续向左边「线性查找」,这样做时间复杂度变成 ,这里 是数组的长度。实际上正确的做法是:在左边查找的时候 继续使用二分查找
  • 说明:「力扣」第 34 题我为大家录制了视频和编写了文字题解,请在后续章节阅读。

查找最后 1 个等于 target 的位置也是类似的道理,我们就不重复描述了。

# 例 2:「力扣」第 35 题:搜索插入位置

题目描述:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

你可以假设数组中无重复元素。

示例 1:

输入: [1, 3, 5, 6], 5
输出: 2

示例 2:

输入: [1, 3, 5, 6], 2
输出: 1

示例 3:

输入: [1, 3, 5, 6], 7
输出: 4

示例 4:

输入: [1, 3, 5, 6], 0
输出: 0

示例 5:

输入: nums = [1], target = 0
输出: 0

题意分析

我们需要仔细看题目中给出的示例,分析题目要我们返回的「插入元素的位置」到底是什么。

根据示例 3:

输入: [1, 3, 5, 6], 7
输出: 4

如果目标元素大于输入数组中的最后一个元素,题目需要我们返回数组的最后一个元素的下标

又根据示例 2:

输入: [1, 3, 5, 6], 2
输出: 1

题目需要我们返回第 1 个 大于等于(等于的情况可以看「示例 1」) 目标元素 的下标,因此返回

提示:「二分查找」的问题,分析题意、认真看题很重要,题目当中都会告诉我们搜索的范围是什么,到底在左边找还是右边找。

「查找第 1 次出现的位置」和「查找第一个大于等于 target 的元素的位置」这样的问题,如果根据 mid 位置的值,把待搜索区间分成 个部分,不能够确定问题的答案一定在其中某一个区间里,但一定可以确定的是:问题的答案一定不在其中某一个区间里

例如,「力扣」第 34 题:

例如,「力扣」第 35 题:

根据这些问题的公共的特点,每一次我们把一定不存在问题答案的区间去掉就可以了。因此我们只需要 把区间分成两个部分,这是下一节的内容。

我们再看一个问题,也有这样的特点,这道题是「力扣」第 69 题。

# 例 3:「力扣」第 69 题:平方根(简单)

根据题意,我们要找的是平方以后 小于等于 的最大正整数 。用「二分查找」找到了一个整数 ,如果它的平方 严格小于 ,此时 还不能确定是题目的答案,只有当我们可以确定,所有大于 的值都不是解的时候, 才是答案。

例如:

  • 的平方根, 的平方根;
  • 的平方根,,因此 是(本题规定下) 的平方根。

作者:liweiwei1419 链接:https://suanfa8.com/binary-search/problem-features 来源:算法吧 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Last Updated: 11/18/2024, 11:23:03 PM