(给算法爱好者加星标,修炼编程内功)
来源: 数据结构和算法-山大王wld
问题描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例 1:
输入: nums = [5,7,7,8,8,10],
target = 8
输出: [3,4]
示例 2:
输入: nums = [5,7,7,8,8,10],
target = 6
输出: [-1,-1]
二分法查找
题中说了是升序的数组,也就是排过序的,对于排过序的数组查找我们
很容易想到的就是二分法。这里要返回的是目标值在数组中的开始位置和结束位置,因为相同的数字在排序数组中肯定是挨着的,所以我们通过二分法查到之后,还要往前和往后继续查找,直到不等于目标值为止。
如果是做Android的并且经常看源码的可能知道,Android中有个类ArrayMap,他存储的时候hash值是排过序的,查找的时候也是通过二分法查找,但有可能hash值会有冲突,所以他查找之后也是分别往前和往后继续查找然后再比较key值,和这题解法很相似。我们来画个简图看一下
比如我们通过二分法查找7,然后还要往他的前面和后面继续查找,目的是要找到最开始7和最后7的位置,来看下代码
1
二分法的另一种写法
二分查找一般我们找到某个值之后会直接返回。其实我们有时候还可以对二分法进行改造,当查找某个值的时候不直接返回,而是要继续查找,直到左右两个指针相遇为止。像下面这样,代码中有详细的注释,可以看一下
1
看到这里可能有的同学灵光乍现,通过二分法能找到target第一次出现的位置,那么通过二分法能不能找到target最后一次出现的位置。当然也是可以的,代码在下面给你准备好了
1
总结
以前对二分法的查找,我们是找到之后就返回。但如果有多个重复的值,我们是没法确定返回的是哪个值的下标。今天这里我们对二分法进行了改造,如果有多个重复的值,你想返回第一个值或者最后一个值的下标都是可以的。
- EOF -
推荐阅读 点击标题可跳转1、算法题375:在每个树行中找最大值
2、图解排序算法:快速排序
3、排序算法:Heap Sort 堆排序与 Top K 问题
觉得本文有帮助?请分享给更多人
关注「算法爱好者」加星标,修炼编程内功
好文章,我在看❤️