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

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

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

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 周赛的解题报告,一起体会上分之旅。
72 1
|
5月前
【刷题记录】尼科彻斯定理、数对、环形结构
【刷题记录】尼科彻斯定理、数对、环形结构
|
存储 C++ 容器
五道超经典题目,带你手撕链表题(多种方法实现)下
五道超经典题目,带你手撕链表题(多种方法实现)
70 1
|
8月前
|
算法 C++ Java
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题
60 0
C/C++每日一练(20230421) 位1的个数、递归和非递归求和、俄罗斯套娃信封问题
《蓝桥杯每日一题》递归·AcWing 1497. 树的遍历
《蓝桥杯每日一题》递归·AcWing 1497. 树的遍历
67 0
五道超经典题目,带你手撕链表题(多种方法实现)上
五道超经典题目,带你手撕链表题(多种方法实现)
118 0
|
算法
【算法思维训练-剑指Offer联名 二】递归与循环篇
【算法思维训练-剑指Offer联名 二】递归与循环篇
94 0
|
算法 C语言
二分查找——我欲修仙(功法篇)
二分查找——我欲修仙(功法篇)
98 0
LeetCode每日一题(11)——太平洋大西洋水流问题(递归,深度优先遍历实例)
大西洋太平洋水流问题 1.题目 2.示例 3.思路 理解题目 解题思路 4.代码
154 0
LeetCode每日一题(11)——太平洋大西洋水流问题(递归,深度优先遍历实例)
|
存储 移动开发
【蓝桥杯集训·每日一题】AcWing 1497. 树的遍历
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 递归
80 0