算法_数组_二分查找

二分查找

leetcode题目链接

1.二分查找前提

(1)有序数组
(2)数组中无重复元素

2.二分查找两种写法

二分法,关键在于区间的定义,即目标值target在左闭右闭区间[left,right],还是在左闭右开区间[left,right)

第一种 — 左闭右闭区间[left,right]

左闭右闭区间就会导致下面三个细节的写法:
(1)while(left<=right)
(2)right = mid - 1
(3)初始化 right = len(nums)-1

(1)原因:因为我们定义target在[left,right]之间,包括在索引在left和right时,所以当left==right时,我们还需要做一次判断,看看target在不在它们之间

(2)原因:以数组升序为例,因为判断nums[mid_第一次]>target时已经判断过索引为mid的情况了,假如我们更新right=mid_第一次,那么第二次循环判断时的条件就变成了target在[left,mid_第一次],这个条件就不成立了,因为我们已经知道了nums[mid_第二次]>target了

代码如下:(以升序为例)

def search(nums,target):
	left,right = 0,len(nums)-1
	while(left<=right):
		mid = int(left + (right - left) // 2)
		if nums[mid]>target:
			right = mid - 1
		elif nums[mid]<target:
			left = mid + 1
		else:
			return mid
	return -1 # 表示target不在nums中

第二种 — 左闭右开区间[left,right)

左闭右闭区间就会导致下面三个细节的写法:
(1)while(left<right)
(2)right = mid
(3)初始化 right = len(nums)

有了上面的推导,这个也可以以此来推理

代码如下:

def search(nums,target):
	left, right = 0, len(nums)
	while(left<right):
		mid = int(left + (right-left) // 2)
		if nums[mid]>target:
			right = mid
		elif nums[mid]<target:
			left = mid + 1
		else:
			return mid
	return -1

3.总结

python语法

  1. index的用法
    使用index()获取列表中指定值的索引

     例如:nums.index(target)
    
  2. //和/的区别
    //:表示整型除法
    /:表示浮点型除法

算法

二分查找要点:

  1. 定义target所在的区间是左闭右闭,还是左闭右开
  2. 三个细节:while循环判断条件 、right值的初始化 、 right值的更新

4.相关题目推荐

35.搜索插入位置
34.在排序数组中查找元素的第一个和最后一个位置
69.x 的平方根
367.有效的完全平方数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值