有序数组二分查找最接近的值
有序数组二分查找最接近的值
- 问题
- 思路
- 代码
- 循环的终止条件
- 如何改为求upper_bound
问题
给你一个有序数组,数组里面有正有负,有重复值,再给你扔一个target 数,求这个数组中最接近target的数的值。如果有多个返回一个即可。
思路
求lower_bound,也就是我们可以通过求第一个大于等于targetnum的值来获取。
但是求得lower_bound之后不一定代表着最接近,因为可能比target小的数更接近target,因此最后来一个比较即可。
代码
最简单的直接调用API
int binaryfind(vector<int>& vec, const int target)
{auto j = lower_bound(vec.begin(), vec.end(), target);if (j - vec.begin() == 0 || abs(*(j - 1) - target) > abs(*j - target)) {return *j;}else {return *(j - 1);}
}
也可以自己手动实现:
int binaryfind(vector<int>& vec, const int target)
{int size = vec.size();if (target <= vec[0]){return vec[0];}if (target >= vec[size - 1]){return vec[size - 1];}int left, right, mid;left = 0;right = size - 1;while (left < right){mid = left + (right - left) / 2;if (vec[mid] == target){return vec[mid];}else if (vec[mid]<target){left = mid+1;}else{right = mid;}}if (left==0||abs(target - vec[left]) < abs(target - vec[left - 1])) {return vec[left];}else{return vec[left-1];}
}
有两个值得注意的地方,也是很多人写二分老是搞不清楚的地方
循环的终止条件
有两种写法:
while (left < right){if(A){left=mid+1;}else{right=mid;}}
以及
while (left <= right){if(A){left=mid+1;}else{right=mid-1;}}
这两种写法是等价的
如何改为求upper_bound
我们只需要更改第一个if条件语句从<改为<=即可
有序数组二分查找最接近的值相关推荐
- 无序链表(顺序查找)和有序数组(二分查找)-基础实现-符号表(二)-数据结构和算法(Java)
文章目录 1 无序链表的顺序查找 1.1 无序链表实现 1.2 分析 2 有序数组中的二分查找 2.1 实现 2.2 分析 3 对二分查找的分析 4 总结 5 后记 1 无序链表的顺序查找 1.1 无 ...
- 有序数组二分查找java_详解Java数据结构和算法(有序数组和二分查找)
一.概述 有序数组中常常用到二分查找,能提高查找的速度.今天,我们用顺序查找和二分查找实现数组的增删改查. 二.有序数组的优缺点 优点:查找速度比无序数组快多了 缺点:插入时要按排序方式把后面的数据进 ...
- java数组二分查找_java 13-1 数组高级二分查找
查找: 1.基本查找:数组元素无序(从头找到尾) 2.二分查找(折半查找):数组元素有序 pS:数组的元素必须有顺序,从小到大或者从大到小.以下的分析是从小到大的数组 二分查找分析: A:先对数组进行 ...
- 关于二分查找算法中中间值的获取
关于二分查找算法中中间值的获取 //left是左边元素索引的变量,right是右边元素索引的变量 int mid = (left + right) / 2; //这样写的话可能会出现问题,当数组中的元 ...
- 二分查找及有重复值的查找
二分查找 1.二分查找 二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法.他的时间复杂度为O(logN) 2.在一组没有重复值的升序数组中查找所求数 //代码及其运行截图 int B ...
- 有序数组中查找数字的范围
有序数组中查找数字的范围 如题所示: 思路 源代码如下: 如题所示: 统计一个数字在排序数组中出现的次数 思路 使用二分查找,分别找到数字的下边界和上边界 源代码如下: class Solution ...
- 循环有序数组中查找某个数
循环有序数组中查找某个数 利用二分查找, 一个循环有序数组从中间切分,一定分成一个有序数组和一个循环有序数组,由于循环有序数组不容易判断,我们只需判断哪一边是有序数组以及target是不是在有序数组 ...
- 【C语言】用二分查找法在有序数组中查找具体的某个数
当给定一个有序数组,而我们要在这个数组中查找某个数时,我们常常用从头到尾的排除法遍历寻找,但是这种方式及其低效,n个数的数组最差要找n次.而后面我们会知道,二分查找法则高效的多,最差要找log以2为低 ...
- C语言求一个数组中第k大的数,leetcode | Median of Two Sorted Arrays 寻找2个有序数组中第k大的值...
There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...
最新文章
- Mac 技术篇-苹果笔记本休眠启动后WIFI连接转圈卡死置灰不可用解决方法,mac通过终端杀进程实例演示
- matlab fftshift_MATLAB信号频谱分析FFT详解
- androidfiletransfer_mac手机助手(Android File Transfer)下载_mac手机助手(Android File Transfer)官方下载...
- Eclipse调试进入JDK源码
- 如何清理qt源码_Qt+FFmpeg本地录制音频
- SSAS事实表和维度表数据类型必须一致
- 全网首发:No package ‘usbutils‘ found
- 手把手教你在Linux环境下安装Python3
- Arduino基础学习-SG90舵机的使用
- Linux XFS 文件系统文件的删除恢复
- 搜索引擎使用的10个技巧
- linux下的.swp文件
- dw css定位,Dreamweaver中层的定位
- 【自媒体营销神器】一键自动下载短视频并分发至长视频平台脚本开源展示
- Vmware+Ubuntu18.04配置桥接模式,并解决虚机中网络慢的问题
- React的setState立即执行方案
- 深度学习模型轻量化(上)
- ARM架构-arm基础
- 考研数据结构学习笔记1
- AUTOSAR Classic Platform支持SOME/IP吗?