有序数组二分查找最接近的值

  • 问题
  • 思路
  • 代码
    • 循环的终止条件
    • 如何改为求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条件语句从<改为<=即可

有序数组二分查找最接近的值相关推荐

  1. 无序链表(顺序查找)和有序数组(二分查找)-基础实现-符号表(二)-数据结构和算法(Java)

    文章目录 1 无序链表的顺序查找 1.1 无序链表实现 1.2 分析 2 有序数组中的二分查找 2.1 实现 2.2 分析 3 对二分查找的分析 4 总结 5 后记 1 无序链表的顺序查找 1.1 无 ...

  2. 有序数组二分查找java_详解Java数据结构和算法(有序数组和二分查找)

    一.概述 有序数组中常常用到二分查找,能提高查找的速度.今天,我们用顺序查找和二分查找实现数组的增删改查. 二.有序数组的优缺点 优点:查找速度比无序数组快多了 缺点:插入时要按排序方式把后面的数据进 ...

  3. java数组二分查找_java 13-1 数组高级二分查找

    查找: 1.基本查找:数组元素无序(从头找到尾) 2.二分查找(折半查找):数组元素有序 pS:数组的元素必须有顺序,从小到大或者从大到小.以下的分析是从小到大的数组 二分查找分析: A:先对数组进行 ...

  4. 关于二分查找算法中中间值的获取

    关于二分查找算法中中间值的获取 //left是左边元素索引的变量,right是右边元素索引的变量 int mid = (left + right) / 2; //这样写的话可能会出现问题,当数组中的元 ...

  5. 二分查找及有重复值的查找

    二分查找 1.二分查找 二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法.他的时间复杂度为O(logN) 2.在一组没有重复值的升序数组中查找所求数 //代码及其运行截图 int B ...

  6. 有序数组中查找数字的范围

    有序数组中查找数字的范围 如题所示: 思路 源代码如下: 如题所示: 统计一个数字在排序数组中出现的次数 思路 使用二分查找,分别找到数字的下边界和上边界 源代码如下: class Solution ...

  7. 循环有序数组中查找某个数

    循环有序数组中查找某个数 利用二分查找,  一个循环有序数组从中间切分,一定分成一个有序数组和一个循环有序数组,由于循环有序数组不容易判断,我们只需判断哪一边是有序数组以及target是不是在有序数组 ...

  8. 【C语言】用二分查找法在有序数组中查找具体的某个数

    当给定一个有序数组,而我们要在这个数组中查找某个数时,我们常常用从头到尾的排除法遍历寻找,但是这种方式及其低效,n个数的数组最差要找n次.而后面我们会知道,二分查找法则高效的多,最差要找log以2为低 ...

  9. 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 ...

最新文章

  1. Mac 技术篇-苹果笔记本休眠启动后WIFI连接转圈卡死置灰不可用解决方法,mac通过终端杀进程实例演示
  2. matlab fftshift_MATLAB信号频谱分析FFT详解
  3. androidfiletransfer_mac手机助手(Android File Transfer)下载_mac手机助手(Android File Transfer)官方下载...
  4. Eclipse调试进入JDK源码
  5. 如何清理qt源码_Qt+FFmpeg本地录制音频
  6. SSAS事实表和维度表数据类型必须一致
  7. 全网首发:No package ‘usbutils‘ found
  8. 手把手教你在Linux环境下安装Python3
  9. Arduino基础学习-SG90舵机的使用
  10. Linux XFS 文件系统文件的删除恢复
  11. 搜索引擎使用的10个技巧
  12. linux下的.swp文件
  13. dw css定位,Dreamweaver中层的定位
  14. 【自媒体营销神器】一键自动下载短视频并分发至长视频平台脚本开源展示
  15. Vmware+Ubuntu18.04配置桥接模式,并解决虚机中网络慢的问题
  16. React的setState立即执行方案
  17. 深度学习模型轻量化(上)
  18. ARM架构-arm基础
  19. 考研数据结构学习笔记1
  20. AUTOSAR Classic Platform支持SOME/IP吗?

热门文章

  1. 鸿蒙系统 智能手表,wear os智能手表和鸿蒙系统智能手表对比
  2. java 模板函数_重温Java中的模板方法设计模式
  3. iOS 浏览相册功能实现 —— HERO博客
  4. 深入理解Android之AOP
  5. html5新年主题,HTML CSS3农历新年祝福语生成器
  6. 常用docker镜像启动了解
  7. Bitmap这个“内存刺客”你要小心~
  8. 计算机科学 泰勒级数,一阶常微分方程泰勒级数解法的计算机实现.pdf
  9. 本地启动wss服务链接不成功原因
  10. Android开发者选项——GPU呈现模式分析