开juǎn有益系列(一)——Binary search(二分查找/折半查找算法)
想要在国内竞争互联网岗位,我们就必须接受现实,开卷!
本文章基于Leetcode 704. 二分查找以及以下题目编写。
Binary search(二分查找法),又名折半查找,是面试题中一个较为热门的考题类,在国内外的很多面试过程中都有出现,而代码随想录也将其作为基础算法进行讲解,说明其确实是一个适合大部分人刷题入门的一个算法门类。
首先看一下其经典题目704. 二分查找
新入门的萌新可能一下就看出端倪:一眼丁真,鉴定为暴力破解,自己遍历一遍就完事
那当然也是可以解决的,就像没有冒泡解决不了的排序一样
但是这并不是我们的目的(当然面试官看到这里或许已经达到了目的并给你划了个叉)
简单的需求往往伴随着多种解决方法,但这个题目为你划定了最优解——二分查找法
**何为二分查找?**可以看看下面这个案例,此案例目标是在此数组中查找到37,上面是二分查找法,而下面是线性查找(也就是所谓的暴力破解法),其动画就可以明显看出其时间复杂度的差距,这也是为什么我们要学习数据结构与算法的原因(当然更多的原因是为了面试拿更高的工资)
回想到Leecode 704 其入参是一个升序数组nums[],以及一个目标值target,出参则是一个索引或者是空(-1)
完全符合此图的演示过程。
首先定义两个指针初始化为索引最高位(high)与最低位(low)
int low = 0;int high = nums.length - 1;//这里是因为索引从0开始,但是x.length是从1开始计算的
之后考虑其循环体的编码逻辑,其题目解决有两种情况:
1.成功寻找到目标数字并返回下标
2.遍历全数组未找到对应目标值并返回-1
而条件1未实现时达成条件2
可知其循环判断条件为当low>high时结束循环(如果写在while里循环条件就是low<=high)
于是可得循环体
int low = 0;int high = nums.length - 1;//这里是因为索引从0开始,但是x.length是从1开始计算的while(low <= high){//TODO}
由上方动图可看出其mid是随high与low动态变化的,也就是保持其high与low的中位
于是计算mid的过程应当写入循环体中
int low = 0;int high = nums.length - 1;//这里是因为索引从0开始,但是x.length是从1开始计算的while(low <= high){int mid = (low + high)/2;//TODO}
在循环体中判断情况1(成功寻找到目标数字并返回下标)的条件,因为在查找的过程中随时都可能找到目标值
int low = 0;int high = nums.length - 1;//这里是因为索引从0开始,但是x.length是从1开始计算的while(low <= high){int mid = (low + high)/2;if(nums[mid] == target){return mid;//return后直接中断函数执行}//TODO}
下方就要考虑high与low两个指针移动的过程了,由动图可看出当nums[mid]小于target的时候,low指针会由原来的位置变成原来的mid+1,而大于时则是high变为mid-1(对应动图的第一步以及第二步)
于是我们可以完善以下代码
class Solution {public int search(int[] nums, int target) {int low = 0;int high = nums.length - 1;//这里是因为索引从0开始,但是x.length是从1开始计算的while(low <= high){int mid = (low + high)/2;if(nums[mid] == target){return mid;//return后直接中断函数执行,达成情况1}if(nums[mid] > target){high = mid - 1;}else{low = mid + 1;}}return -1;//此处循环体外补上遍历结束后未找到目标值的情况2}
}
接下来的部分看周末休息的时候补上,目前还在上班就先不摸了
//TODO
参考文献:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html#_704-%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE
开juǎn有益系列(一)——Binary search(二分查找/折半查找算法)相关推荐
- c++Binary search二分法检索(折半检索)的实现算法(附完整源码)
C++Binary search二分法检索的实现算法 C++Binary search二分法检索(折半检索)的实现算法完整源码(定义,实现,main函数测试) C++Binary search二分法检 ...
- 数据结构之折半查找法(Binary Search)
对于要查找的数据已经排序,此时仍然可以使用顺序查找法来进行查找,但是此时有更加简便的方法, 那就是"折半查找法(Binary Search)". 折半查找法的实现步骤如下: 假设数 ...
- Binary Search(二分搜索)
转载请注明出处 leonchen1024.com/2018/08/14/- 二分搜索(binary search),也叫做 折半搜索(half-interval search),对数搜索(logari ...
- LeetCode-Unique Binary Search Trees
研究生开学以来一直在看书看文献,很少有机会去写代码.为了不让以后校招时被虐的太惨,准备每天看一道LeetCode上的题,练练手. 因此准备开一个新的专题,记录下LeetCode上的一些有意思的小的算法 ...
- 【LeetCode从零单排】No96 Unique Binary Search Trees
题目 Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For ex ...
- [LeetCode]235.Lowest Common Ancestor of a Binary Search Tree
题目 Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the ...
- 二分算法详解:整数二分及浮点数二分算法(Binary Search)(含算法模板)
一.二分算法简介 当我们要从一个序列中查找一个元素的时候,最简单无脑的方法就是顺序查找法,但由于在大数据情况下爆炸的时间复杂度而舍弃. 最常见的方法是二分查找,也称折半查找(Binary Search ...
- #2020寒假集训#二分入门(Binary Search)代码笔记
二分查找--Binary Search 原理就类似于下图啦(网上看到哒,忽略这个代价) 二分的时间复杂度一般是 O(logN) 的,超开心了有木有٩(๑>◡<๑)۶ 最简单来说,它可以分为 ...
- 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...
- 【ACM】二叉搜索树(Binary Search Tree /BS Tree) 小结
动态管理集合的数据结构--二叉搜索树 搜索树是一种可以进行插入,搜索,删除等操作的数据结构,可以用字典或者优先队列. 二叉排序树又称为二叉查找树,他或者为空树,或者是满足如下性质的二叉树. (1)若它 ...
最新文章
- 英伟达十年力作:新一代光线追踪显卡 Quadro RTX及核心架构Turing,可支持AI运算...
- xx学OD -- 消息断点 RUN跟踪(下)
- [译]WPF 应用程序和MVVM设计模式 ——Josh Smith
- VTK:PCA用法实战
- 企业网站 源码 e-mail_天津seo优化套餐服务收费_天津网站优化关键词价格
- Python SHA1加密算法
- 蓝桥杯第八届省赛JAVA真题----分巧克力
- 【BZOJ4128】Matrix,拔山盖世的矩阵乘法+随机化
- 对TRIM SCSI命令的一些分析
- 第二章节 ASP.NET 验证控件(二)
- Qt5学习笔记之bin文件合成工具四:完善功能打包程序
- 这个技巧,让你更从容地使用Mac电脑~
- 2. laravel 创建第一条路由
- seems to be corrupted. Trying one more time
- 数据管理平台DMP细致研究——BlueKai
- Python爬虫学习(六)selenium自动化测试登陆百度账号_滑动验证码问题
- 计算机考研是属于工学呢还是理学呀,计算机考研是属于工学呢还是理学
- 2021年司钻(井下)考试及司钻(井下)考试报名
- java 序列化理解_对Java Serializable(序列化)的理解和总结(二)
- 【无标题】删除数组中的重复元素