嗯 在看了labuladong哥之前写的一篇文章,结合最近遇到的4种题型,总结一下四种二分查找的模板吧。 链接地址:https://mp.weixin.qq.com/s/uA2suoVykENmCQcKFMOSuQ
我是结合大神的模板然后总结出自己的4个屡试不爽的模板吧。给速成的人吃快餐 死记硬背也能完全get解法
这是一个万能模板。
def binarySearch(nums:list, target:int) {
int left = 0, right = ...;
while(...) {
mid = (right + left) // 2;
if nums[mid] == target:
...
else if nums[mid] < target) :
left = ...
else if nums[mid] > target):
right = ...
return ...
其中。。。是需要注意会出错的地方了。
1.基本二分查找,寻找一个数
基本二分查找一个数的模板。
def binarySearch(nums:list, target:int) {
int left = 0, right = len(nums)-1;
while(left<=right) {
mid = (right + left) // 2;
if nums[mid] == target:
return mid
else if nums[mid] < target) :
left = mid+1
else if nums[mid] > target):
right = mid-1
return -1
2.寻找数的左侧边界,意思是返回<target的最大index
def binarySearch(nums:list, target:int) {
int left = 0, right = len(nums);
while(left<right) {
mid = (right + left)//2;
if nums[mid] <target:
left = mid+1
else:
right = mid
return left
3.寻找数的右侧边界,返回<=target的最大index。
def binarySearch(nums:list, target:int) {
int left = 0, right = len(nums);
while(left<right) {
mid = (right + left)//2;
if nums[mid] <=target:
left = mid+1
else:
right = mid
return left-1
4.寻找数的右侧位,返回>target的最小index
这个与3类似,区别就是最后返回的是left,为了防止target超过数组最大元素导致left=size出现越界,所以在最开始先判断target是否大于等于数组中最大的元素,如果大于等于就直接return -1
def binarySearch(nums:list, target:int) {
int left = 0, right = len(nums);
if target>= nums[right-1]:
return -1
while(left<right) {
mid = (right + left)//2;
if nums[mid] <=target:
left = mid+1
else:
right = mid
return left-1
总结:
基本二分查找就不说了。
主要说后三种边界定位 小于的最大index。小于等于的最大index 大于的最小index
首先三种的搜索区间right都为len(nums),也就决定了循环判断都是left<right
三种判断right的收紧都为mid left都为mid+1,对于第一种情况 mid<target是一种情况,对于第二第三种 mid<=target是一种情况
第三种最后返回left 同时为了防止越界首先先加入判断。