前言
第9天:二分查找
二分查找也称折半查找(Binary Search),是一种在有序数组中查找某一特定元素的搜索算法。我们可以从定义可知,运用二分搜索的前提是数组必须是有序的,二分查找的时间复杂度为O(
log
2
n
\log_2 n
log2n),除了查找元素,衍生出的有如查找左区间,右区间等,查找对象也从有序数组衍生出有如螺旋数组等,有关此类的参考资料十分多,在此我强推一波参考链接1,总结的很详细也很生动。
一、练习题目
题目链接 | 难度 |
---|---|
35. 搜索插入位置 | ★☆☆☆☆ |
704. 二分查找 | ★☆☆☆☆ |
剑指 Offer 53 - I. 在排序数组中查找数字 I | ★☆☆☆☆ |
33. 搜索旋转排序数组 | ★★☆☆☆ |
二、思路与代码
1. 搜索插入位置
题目描述:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。
解题思路:
1)
2)
class Solution(object):
def searchInsert(self, nums, target):
l, r = 0, len(nums)-1
while l <= r:
mid = l + (r - l) // 2
if nums[mid] == target:
return mid
if target < nums[mid]:
r = mid - 1
if target > nums[mid]:
l = mid + 1
return l
2. 二分查找
题目描述:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
解题思路:
只需要把第一题返回值修改一下就可以了。
class Solution(object):
def searchInsert(self, nums, target):
l, r = 0, len(nums)-1
while l <= r:
mid = l + (r - l) // 2
if nums[mid] == target:
return mid
if target < nums[mid]:
r = mid - 1
if target > nums[mid]:
l = mid + 1
return l
3. 在排序数组中查找数字 I
题目描述:
统计一个数字在排序数组中出现的次数。
解题思路:
1)用二分法查找大于等于target目标值的下标ans
;
2)从下标ans
处遍历数组,找到大小等于target的个数。
class Solution(object):
def search(self, nums, target):
l, r = 0, len(nums)-1
cnt, ans = 0, 0
if len(nums) == 0:
return 0
while l <= r:
mid = l + (r - l) // 2
if nums[mid] >= target:
ans = mid
r = mid - 1
else:
l = mid + 1
if ans == len(nums) or nums[ans] != target:
return 0
else:
while(ans < len(nums) and nums[ans] == target):
cnt += 1
ans += 1
return cnt
4. 题目标题
解题思路: https://leetcode.cn/problems/search-in-rotated-sorted-array/solution/sou-suo-xuan-zhuan-pai-xu-shu-zu-by-leetcode-solut/
class Solution(object):
def search(self, nums, target):
if not nums:
return -1
l, r = 0, len(nums) - 1
while l <= r:
mid = (l + r) // 2
if nums[mid] == target:
return mid
if nums[0] <= nums[mid]:
if nums[0] <= target < nums[mid]:
r = mid - 1
else:
l = mid + 1
else:
if nums[mid] < target <= nums[len(nums) - 1]:
l = mid + 1
else:
r = mid - 1
return -1
参考资料
[1]穿几个马甲,就认不出你是二分法?https://mp.weixin.qq.com/s/1ExIav9uK4bvVnnf4t0H2Q