请收下今日份的编程技巧速递(二分查找和递归)

简介: 请收下今日份的编程技巧速递(二分查找和递归)

最近有个读者朋友在我的技术交流群问了一个关于二分查找的问题,具体题目如下。

640.jpg

如果你是第一次接触这个问题,能够写出答案,那我觉得你堪称天才了。


接触过这个问题的朋友对解决方案可以脱口而出,使用二分查找。计算机科班出身的同学在教科书上已经学习过二分查找的算法了,在一个已经排好序的无重复数值的数组寻找某个数。但是当我们着手解决各种二分查找算法问题时,经常会写出死循环和数组越界的代码。


网上有不少二分查找的模板,可以分为三大类。

640.jpg

640.jpg

三个模板,记忆力再好,也有可能初一记得,十五就忘了。有没有一套模板就能搞定的呢?还真让我在bilibili上找到了。代码很简单,比教科书上找某个确定值还要简单。


二分查找为什么总是写错?


https://www.bilibili.com/video/BV1d54y1q7k7

640.jpg

视频上的弹幕基本都是,牛逼,厉害,完美之类的赞叹。颇有几分相见恨晚的意思,更有几分要是早有人告诉这么解二分查找的问题,我就不会丢分之类的感觉。


但是思路好归好,你一个籍籍无名的B站up主的算法思路,无法不让人产生怀疑。效率能行吗?解法主流吗?能否经得起各种case的考验


结果有一天我在medium上发现了kotlin项目leader发的一篇类似的文章。内容几乎一样。有了大佬的加持,我深信这套代码没问题,肯定不是无中生有的了。

640.jpg

最后在评论区发现了一个知识盲区,tail recursion,一个读者用递归的形式解决了这个问题,然后用了kotlin的特性 tailrec将递归转成迭代方式

640.jpg

640.jpg

然后我找到了关于尾部递归的资料,大家感兴趣可以看看。

相关文章
|
算法 Android开发
LeetCode 周赛上分之旅 #48 一道简单的树上动态规划问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
77 1
|
算法 Android开发 索引
LeetCode 周赛上分之旅 #44 同余前缀和问题与经典倍增 LCA 算法
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
99 0
|
10月前
|
算法 C++ Java
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题
65 0
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题
|
10月前
|
人工智能 BI
【每日一题】1. 牛客网——合并两个有序数组
【每日一题】1. 牛客网——合并两个有序数组
|
10月前
|
算法 vr&ar
1611F - ATM and Students详细题解(*1800,线段树维护前缀和;双指针算法(思维))
1611F - ATM and Students详细题解(*1800,线段树维护前缀和;双指针算法(思维))
66 0
|
10月前
六六力扣刷题回溯之子集2
六六力扣刷题回溯之子集2
46 0
|
10月前
|
算法
六六力扣刷题回溯之子集
六六力扣刷题回溯之子集
55 0
|
存储 C++
【C++从0到王者】第三十站:二叉树的非递归遍历
【C++从0到王者】第三十站:二叉树的非递归遍历
52 0
|
C语言
[链表OJ题 8] 用栈实现队列,没想到你小子的基础这么好,这么快就做对了
[链表OJ题 8] 用栈实现队列,没想到你小子的基础这么好,这么快就做对了
汉诺塔+小青蛙跳台阶---《递归》
汉诺塔+小青蛙跳台阶---《递归》
128 0