NC105 二分查找-II
描述 请实现有重复数字的升序数组的二分查找 给定一个 元素有序的(升序)长度为n的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返回下标,否则返回 -1
数据范围:0<=n<=100000
进阶:时间复杂度O(logn),空间复杂度O(n)
思路:二分法,先找到target,如果nums[middle]==target,且nums[middle-1]<target,说明middle就是要找的下标。while循环结束后,还没有return过的,可能target在数组两边,nums[0]或nums[len(num)-1]的位置。在最开始的时候判断0的情况,在while循环结束的时候判断len(num)-1的情况
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 如果目标值存在返回下标,否则返回 -1
# @param nums int整型一维数组
# @param target int整型
# @return int整型
#
class Solution:
def search(self , nums: List[int], target: int) -> int:
# write code here
if len(nums) == 0:
return -1
if nums[0] == target:
return 0
left = 0
right = len(nums) - 1
while left < right:
middle = (left + right) // 2
if nums[middle] >= target:
right = middle - 1
if nums[right] < target:
if nums[middle] == target:
return middle
return -1
else:
left = middle + 1
if nums[right] == target:
return right
return -1