二分查找算法总结:
搜索target范围,搜索旋转数组
- 使用 left<=right 条件,上面是从左往右找,下面是从右往左找,都是定位到可以第一个insert的地方
def searchRange(nums: List[int], target: int) -> List[int]:
l, r = 0, len(nums) - 1
while l <= r:
mid = (l + r) // 2
if nums[mid] >= target:
r = mid - 1
else:
l = mid + 1
left = l
l, r = 0, len(nums) - 1
while l <= r:
mid = (l + r + 1) // 2
if nums[mid] <= target:
l = mid + 1
else:
r = mid - 1
right = r
if right < 0 or nums[right] != target:
return [-1, -1]
return [left, right]
def searchRange(nums: List[int], target: int) -> List[int]:
l, r = 0, len(nums) - 1
while l < r:
mid = (l + r) // 2
if nums[mid] >= target:
r = mid
else:
l = mid + 1
left = l
l, r = 0, len(nums) - 1
while l < r:
mid = (l + r + 1) // 2
if nums[mid] <= target:
l = mid
else:
r = mid - 1
right = r
if right < 0 or nums[right] != target:
return [-1, -1]
return [left, right]
def search(nums: List[int], target: int) -> int:
l, r = 0, len(nums) - 1
while l <= r:
print(l, r)
mid = (l + r) // 2
if nums[mid] == target:
return mid
if nums[mid] >= nums[l]:
if nums[mid] >= target and nums[l] <= target:
r = mid - 1
else:
l = mid + 1
else:
if nums[mid] <= target and nums[r] >= target:
l = mid + 1
else:
r = mid - 1
return -1