之前大一下参加的蓝桥杯,纯暴力解法拿了三等奖,这学期继续参加,选了python组,希望能拿个好名次,然后在看代码随想录的算法,第一集是二分的写法,于是借此写一篇笔记
二分法应想好区间条件,由while的条件判断之后该怎么改变边界
class Binserach(object):
def binary_search1(self, array, data):
array.sort()
# 左闭右闭
left = 0
right = len(array)-1
while left <= right:
mid = (left+right)//2
if array[mid] > data:
right = mid - 1
elif array[mid] < data:
left = mid + 1
else:
return True
return False
左闭右闭while条件则必须left<=right,数组必须先利用python中数组sort方法排好序。
左闭右开while条件则为left<right,因为当left=right时例如[1,1)是非法的,且此时right应等于len(array),要不然检测不到右边界,right的修改条件也应改成right=mid
class Solution:
def search(self, nums: List[int], target: int) -> int:
left,right=0,len(nums)
while left < right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
right = mid
elif nums[mid] < target:
left = mid + 1
return -1
左闭右开写法,leetcode通过
出现的问题:
1.数组尚未排序————>二分法条件要求有序数组
2.right应赋值数组长度-1,因为数组下标从零算起—————>数组基本规则
3.在while版中mid应放在while语句中随之更新————>递归版本中mid放在def中
4.while语句中一条return语句,while语句外一条return语句————>while外不放则是None
class Binary(object):
def binary_search2(self, array, data):
if len(array) == 0:
return False
array.sort()
mid = len(array) // 2
if array[mid] == data:
return True
elif array[mid] < data:
return self.binary_search2(array[mid + 1:], data)
elif array[mid] > data:
return self.binary_search2(array[:mid - 1], data)
else:
return False
递归实现:
重复调用自身函数
(一)查找第一个值等于给定值的元素
(二)查找最后一个值等于给定值的元素
(三)查找第一个大于等于给定值的元素
(四)查找最后一个小于等于给定值的元素
剩余三个有待学习,是从最后结束返回return条件改变
参考文章: