题目链接
描述
给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。
难度
简单
样例
样例 1:
输入:[1,4,4,5,7,7,8,9,9,10],1
输出: 0
样例解释:
第一次出现在第0个位置。
样例 2:
输入: [1, 2, 3, 3, 4, 5, 10],3
输出: 2
样例解释:
第一次出现在第2个位置
样例 3:
输入: [1, 2, 3, 3, 4, 5, 10],6
输出: -1
样例解释:
没有出现过6, 返回-1
代码
class Solution:
def binarySearch(self, nums, target):
# write your code here
if nums==[]: # 如果列表为空,直接返回-1
return -1
start = 0 # 起始位置
end = len(nums)-1 # 结束位置
count = 0
while (start<=end):
mid = (start+end)//2 #中间位置
if target==nums[mid]: # 找到就返回mid
mid = count+nums[start:end+1].index(target)
return mid
if target>nums[mid]: #更新起始位置或结束位置
start=mid+1
count = start
else:
end = mid-1
return -1 #没找到返回-1
思路
刚开始直接使用的list.index()方法,不符合二分查找。使用二分查找后发现并不能准确查找到第一个target出现的位置。
代码解读
如果第一次循环查找刚好中间那个值就是target,那就返回mid:看起来没有问题,但是列表如果是这样的呢[5,5,5,5,5,5,5,5],这个时候应该返回0,而不是mid,所以返回mid所在列表的target索引(nums[start,end+1].index(target))。接下来就是target大于mid的时候了:大于就得往右找,因为我们要查询第一次出现的位置,所以前面的索引我们得用一个count接收,最后输出的前面的索引加上当前target所在的列表的索引。target小于mid:向左找,start=0,我们就可以用list.index()。
耗时151ms,超过81%的提交