【leetcode】34Search for a Range(二分搜索上下界)

来源:互联网 发布:网络棋牌游戏算赌博吗 编辑:程序博客网 时间:2024/06/06 02:07

题目大意:给出一排好序的整型数组,给定一个目标值,如果数组中有目标值,则要求返回目标值下标范围,例如:[5, 7, 7, 8, 8, 10],目标值为8,函数应当返回[3,4],如果数组中没有目标值,则返回[-1,-1],要求时间复杂度O(logn)


题目解法:数组有序显然会想到二分查找,二分查找不仅可以找到准确的值的位置也可以找到边界位置(如第一个大于等于某值或小于等于某值的位置),在本题中我们需要找到第一个等于目标值的位置以及最后一个等于目标值的位置,可以分两次分别查找


查找第一个等于目标值的位置:

每次将中点值与目标值比较,若小于目标值说明第一个目标值位置应在mid右边,left=mid+1,否则第一个目标值位置应在mid左边(不能排除mid),right=mid

其中求中间位置写成mid=left+(right-left)/2而不是mid=(left+right)/2是为了防止溢出

while(left<right){mid=left+(right-left)/2;if(nums[mid]<target) left=mid+1;else right=mid;}

查找最后一个目标值的位置:

与前面的相似,将中点值与目标值比较,若大于目标值,则说明最后一个目标值在mid左边,right=mid-1,其他情况则说明最后一个目标值在mid右边(不能排除mid)left=mid

特别注意求中间位置要写成mid=left+(right-left+1)/2,这是因为当left+1=right时,若按照原有写法,无论中间位置的值与目标值是什么关系,都无法跳出循环,最终形成死循环

while(left<right){mid=left+(right-left+1)/2;if(nums[mid]>target) right=mid-1;else left=mid;}


这道题总的代码如下


0 0
原创粉丝点击