# 第 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 来源:算法吧 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。