二分查找
文章平均质量分 88
二分查找LeetCode刷题。
raykingl
用魔法打败魔法,走楼梯啊!
展开
-
000.二分查找算法题解目录
000.二分查找算法题解目录69. x 的平方根(简单)原创 2024-07-01 22:57:22 · 231 阅读 · 0 评论 -
4. 寻找两个正序数组的中位数(困难)
两个有序数组,寻找二者的中位数,最直观的方法是先归并这两个数组为一个有序数组,中位数则为中间的数字,算法时间复杂度为。通俗的说,即将数据一分为二,且其中一个集合中数据最大值小于等于另一个集合中数据的最小值。时,显然不能均分该两个数组,因此应首先判断两个数组的长度,将长度更小的数组作为第一个数组。时间复杂度,首先肯定不能先归并两个数组了,两个数组均有序,应当充分运用这个条件。,将两个数组一分为二,两个数组的左半部分构成一个集合,右半部分构成另一个集合。因此,对于题目中的两个数组,相当于要在数组。原创 2024-08-18 16:01:00 · 802 阅读 · 1 评论 -
540. 有序数组中的单一元素(中等)
数组中除了一个元素仅出现一次,其它元素均出现两次,因此数组的总长度为奇数,二分查找时的中位数恰好将数组等分,且一分为二后的左右区间的元素个数相同,元素个数可能为偶数或奇数。:对于数组中单独出现数字之前成双出对的元素来说,其索引下标均为先偶数再奇数,而单独出现数字后成双出对的元素来说,其索引下标均为先奇数再偶数,那么则可以利用该性质使用二分查找算法,对于。:对于数组中单独出现的数字,其它元素均成双出现,故单独出现数字的索引肯定为偶数,若下标为。元素相等),则单独出现的数字在右区间,否则在左区间;原创 2024-07-04 11:35:05 · 1209 阅读 · 0 评论 -
154. 寻找旋转排序数组中的最小值 II(困难)
非严格升序数组,即存在相同元素的两个值。如果不旋转则最小的数值即为第一个(索引为0)的数值,数组旋转了1到n次,寻找数组中最小的元素,这道题是二分查找的变型题。的基础上,将严格递增数组改为非递减数组,即允许存在相同元素,建议先尝试。的值,可以利用该性质使用二分查找算法。对于严格递增的数组,假定最小值为。,数组旋转后,假定结尾最后一个值为。时间复杂度的扫描遍历一次即可。,而其左边的元素均大于。并理解后再尝试本题。,其右边的元素均小于。原创 2024-07-04 00:02:32 · 788 阅读 · 0 评论 -
153. 寻找旋转排序数组中的最小值(中等)
严格升序数组,即不存在相同元素的两个值。如果不旋转则最小的数值即为第一个(索引为0)的数值,数组旋转了1到n次,寻找数组中最小的元素,这道题是二分查找的变型题。的值,可以利用该性质使用二分查找算法。,数组旋转后,假定结尾最后一个值为。时间复杂度的扫描遍历一次即可。,而其左边的元素均大于。,其右边的元素均小于。原创 2024-07-03 13:24:50 · 982 阅读 · 0 评论 -
81. 搜索旋转排序数组 II(中等)
【可能最大的问题在于为什么能直接想到这个情况,这个确实需要经验,但如果实在想不到,可以正常编写代码,提交后分析错误案例,也能发现此规律】折半后左右区间有序,因此难以判断那个区间有序,针对此类情况需单独讨论,此时观察上述特例,发现有一个明显的特征,即。基础上,将条件严格升序数组改为非递减数组,再旋转后寻找目标值,仅需判断数组中是否存在目标值。类似,建议先练习该题,再练习本题,本题是在。将不再能判断左区间是否有序,例如。折半后左区间无序,而区间。折半后左区间又有序,区间。原创 2024-07-03 09:55:43 · 875 阅读 · 0 评论 -
33. 搜索旋转排序数组(中等)
的算法进行逐一遍历查找目标值的索引,但未能利用局部有序的特性。属于在有序的数组中查找数据,首先想到二分查找算法,但该题能使用二分查找算法吗?给定数组是严格有序的,但在某个位置的下标处进行了旋转,因此改变了数组有序的特性,但数组局部是有序的,虽可以使用算法复杂度为。是无序而非有序,因此应该修改此次代码边界条件,首先判断目标值是否在有序的左区间,不在则更新。,因为数组是局部有序的,如何利用数组局部有序特性呢?,则右区间有序,故首先判断目标值是否在右区间范围内,右区间为。是有序而非无序的,而右区间。原创 2024-07-02 13:33:05 · 879 阅读 · 0 评论 -
34. 在排序数组中查找元素的第一个和最后一个位置(中等)
在非递减(升序)数组中查找目标值的起始和结束位置,如果不存在则返回[-1,-1],最直观和直接的方法是依次遍历,第一次寻找到的位置为起始位置,记录下状态,当数组已遍历完或者遍历到非目标值时,此时上一个位置即为结束位置,时间复杂度为。指针记录的不一定是真实的目标值的起始或结束位置的索引,当未找到目标值的时候,程序循环也会结束,因为需要判断找到的起始或者结束位置是否在索引范围内,或者是否目标值,否则返回-1。对于起始位置,寻找第一个目标值的索引,相当于寻找在目标值出现之前,最后一个不为目标值的索引,加。原创 2024-07-02 00:33:51 · 1088 阅读 · 0 评论 -
69. x 的平方根(简单)
对于此题,是计算算术平方根的整数部分,因此等价于寻找首次平方之和大于x的数,该数减1即为x的算术平方根(假定x的算术平方根为y.z,其中y为整数部分,z为小数部分,y*y的结果是小于x,而(y+1)*(y+1)是大于x的)。不能使用系统内置的函数,寻找某个数(假定为x)的算术平方根,并返回算术平方根的整数部分,最直观的方法是从0依次开始尝试所有小于等于x的数(假定为y),当y*y的积小于等于x时,继续遍历下一个数,直至y*y的积首次大于x时,此时y-1即为x的算术平方根的整数部分,如。原创 2024-07-01 22:56:08 · 975 阅读 · 0 评论