唐伯虎怎么才能快速找到秋香-二分查找算法_唐伯虎点秋香怎么找到秋香的(1)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

return search(nums,0,len(nums)-1,target)

if name==“__main__”:
n=[1,2,3,4,5]
target=5
target_index=binary_search(n,target)
print(target_index)


这里我们主要讲解一下关于第一步为什么要单独取最后一位呢?因为当我们一直迭代,迭代到剩下两个数值的时候,那么start=0,end=1,此时(start+end)//2是等于0的,所以我们这个时候的mid一直取第一个数,不会取第二个数。所以我们定义好如果目标值和第二个数相等那么我们直接取值。  
 这就是简单的一个二分查找,主要涉及到的知识点有:  
 1.递归调用。  
 2.二分查找的方法。  
 3.考虑由于除号➗带来的右边边界的特例。


这里数组是正序排列,对于排列问题我这里不多说,因为乱序我们可以进行排序吗!!!但是数组中有重复值呢?我们怎么办?那么就引出来了我们第二个知识点!二分查找有重复值得有序数组。


##### ✨进阶二分查找问题及求解


我们先来看例子:  
 在一个排序得整数序列中找到目标数,返回该数字出现得最小位置,如果不存在那么返回-1。



> 
> 示例: 【1,2,2,4,5,5】  
>  target=2 输出: 1  
>  【1,2,2,4,5,5】  
>  target=6 输出:-1
> 
> 
> 


我们还是先来分析一波,思路肯定还是二分查找算法得思路,因为我们这次出现了多个秋香,那么唐伯虎应该选择哪个呢?  
 其实按照二分算法,上面我们介绍得则是最后确定为一个值,那么这次我们查找剩下两个值得时候就返回,如果前面得和目标数值相等,那么就返回前面得,如果不等就看后面得和它想不想等,如果都不等于,那么返回-1.  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/a660c61fd41645dca63a2f204a6ec0a1.png)



def binary_chop(nums,t):
if len(nums)==0:
return -1
start=0
end=len(nums)-1
while start+1<end:#关键点
mid=start+(end-start)//2
if nums[mid]<t:
start=mid
else:
end=mid
if nums[start]==t:
return start
elif nums[end]t:
return end
else:
return -1
if name
"__main__":
nums=[1,2,2,4,5,5]
target=6
print(binary_chop(nums,target))


这里我们介绍一下算法思想。很明显这里我们用了指针得思想去解题,while start+1<end:这里是关键,为什么呢,比如我们目标值是2,那么第一波我们取到【1,2,2】,然后继续找到【1,2】然后我们就返回了,然后进入判断!!这里可以推敲一下!  
 知识点总结:  
 1.指针得使用。  
 2.二分查找的方法。  
 3.重复的情况。  
 那么如果我们想要找后面得秋香怎么办呢?其实那就很好办了对吧!小伙伴们可以想一下,我提示一下就是把指针那块改一下,然后判断条件改一下就OK了,这个问题是小,那么如果我们想要得target在数组里面没有,而我们想要找最接近得哪个数值呢?  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/07a91ef7b3184344a08a08ef103b2a64.png)  
 整个人栓住了!!!


##### ✨最终二分查找问题及求解


我们来看例子:  
 在一个排序得数组A中找到i,使得A【i】最接近目标书target。输出i。



> 
> 示例:输入A=【1,2,3】 target=2  
>  输出:1  
>  输入A=【1,4,6,9】 target=7  
>  输出:2
> 
> 
> 


![在这里插入图片描述](https://img-blog.csdnimg.cn/d9cd2cf1f2744e47b375fafebc284b71.png)  
 我们还是先来简单得分析一下,我们还是利用上面得返回两个数值,最后看看是后面的离我近,还是前面的离我近不就完事了吗?我可真是一个小可爱啊!!!



def find_position(nums,t):
if len(nums)0:
return -1
start=0
end=len(nums)-1
while start+1<end:
mid=start+(end-start)//2
if nums[mid]>t:
end=mid
elif nums[mid]<t:
start=mid
else:
return mid
if t-nums[start]<nums[end]-t:
return start
return end
if name
"__main__":
nums=[1,4,6,9]
target=7
print(find_position(nums,target))


这里面我们设定的是数组依旧不重复,那么我们可以想一下如果重复呢?我们该怎么办,需要改动哪里呢?各位小伙伴们可以思考一下!  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/faf58830df634364a1901f116aa52d0d.gif#pic_center)



> 
> 🍻算法讲解针对于想要丰富自己相关知识和语法的小伙伴们🍻  
>  🍹可以选择性观看,小博主尽力做到每个知识点详细讲解和拓展🍹  
>  🎄文章尽可能声形并茂,还要靠各位小伙伴们三连改善🎄  
>  💌小博主在这里感谢各位大佬啦!!!💌
> 
> 
> 





![img](https://img-blog.csdnimg.cn/img_convert/091558180946de00c4365947ee3a02bb.png)
![img](https://img-blog.csdnimg.cn/img_convert/b50ed568d5c869d15a5c5db3c249fcf2.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值