既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
给定一个排序的整数序列nums(升序且不重复)和一个要查找的目标整数target(target在序列中存在,查找目标整数在序列中的下标从0开始)。
示例: 【1,2,3,4,5】 target=3
输出:2
【1,2,3,4,5】 target=5
输出:4
我们首先来分析一下,因为一直要重复做一个工作所以我们想到了使用递归,那么终止条件是什么呢?很简单,那就是找到了呗!唐伯虎点秋香-找到了秋香不就完事了吗!
def search(nums,start,end,target):
if target==nums[len(nums)-1]:
return len(nums)-1#这里表示如果目标值等于最后一个数值,那么我们就返回最后这个值,为什么这么做?看下面
mid=(start+end)//2#取整数
if nums[mid]>target:
return search(nums,start,mid,target)
if nums[mid]<target:
return search(nums,mid,end,target)
if nums[mid]==target:
return mid
def binary\_search(nums,target):
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.
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在数组里面没有,而我们想要找最接近得哪个数值呢?
整个人栓住了!!!
✨最终二分查找问题及求解
我们来看例子:
在一个排序得数组A中找到i,使得A【i】最接近目标书target。输出i。
示例:输入A=【1,2,3】 target=2
输出:1
输入A=【1,4,6,9】 target=7
输出:2
我们还是先来简单得分析一下,我们还是利用上面得返回两个数值,最后看看是后面的离我近,还是前面的离我近不就完事了吗?我可真是一个小可爱啊!!!
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
![img](https://img-blog.csdnimg.cn/img_convert/55d58dac6a7736fdbc6fd18784140724.png)
![img](https://img-blog.csdnimg.cn/img_convert/4b2f4674623ea0793abfa959f6960748.png)
![img](https://img-blog.csdnimg.cn/img_convert/d0f2bd6f498ba094e87b729862590c9a.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**