二分查找(Binary Search)是一种在有序数组中查找特定元素的搜索算法。其基本思想是将待查找的键值与数组中间的元素进行比较,如果两者相等,则查找成功;如果待查找的键值小于中间元素,则在数组的左半部分继续查找;如果待查找的键值大于中间元素,则在数组的
摘要:二分查找 (1) 搜索插入位置 """ 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
二分查找
(1) 搜索插入位置
"""
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
"""
left = 0
right = len(nums)-1
while left <= right:
mid = (left+right)//2
if nums[mid] < target:
left = mid+1
else:
right = mid-1
return left
(2) 在排序数据中查找元素范围
"""
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。
"""
def get_index(nums, target):
left, right = 0, len(nums)-1
while left <= right:
mid = (left+right)//2
if nums[mid] < target:
left = mid+1
else:
right = mid-1
return left
if target not in nums:
return [-1, -1]
start = get_index(nums, target)
end = get_index(nums, target+1)-1
return [start, max(start, end)]
(3) 搜索旋转排序数组
"""
整数数组 nums 按升序排列,数组中的值互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 向左旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 下标 3 上向左旋转后可能变为 [4,5,6,7,0,1,2]。给你旋转后的数组 nums 和一个整数 target,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1。
"""
left, right = 0, len(nums)-1
while left <= right:
mid = (left+right)//2
if nums[mid] == target:
return mid
if nums[left] <= nums[mid]:
if nums[left] <= target < nums[mid]:
right = mid-1
else:
left = mid+1
else:
if nums[mid] < target <= nums[right]:
left = mid+1
else:
right = mid-1
return -1
(4) 寻找旋转排序数组的最小值
"""
给你一个元素值 互不相同 的数组 nums,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的最小元素 。
"""
left, right = 0, len(nums)-1
while left <= right:
mid = (left+right)//2
if nums[mid] >= nums[0]:
left = mid+1
else:
right = mid-1
return nums[left] if left < len(nums) else nums[0]
(5) 寻找两个正序数组的中位数
"""
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
