折半查找——一不小心,又是一个坑。。。

2024-08-21 16:18
文章标签 查找 折半 一不小心

本文主要是介绍折半查找——一不小心,又是一个坑。。。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自黑暗之神

 

折半查找这题本来以为就能一A的。。。想不到却提交了那么多次
却一直WA 检查了半天算法,却也没有发现问题,知道最后才猛的想到
输入的数可能是会有重复的
比如
4 3
1 1 2 4
1 3 4
如果按题中所给的算法,得出的便是 1 -1 3
而答案所想要的是0 -1 3(虽然它压根就没有告诉你。。。。-_-|||)
即答案所想要的是
等于 v 的第一个值

下附上两种算法
1,普通二分查找
int bs(int a[],int l,int h,int v)
{
int m;
while(l<h)
{
  m=(l+h)>>1;//移位,即相当于除以2
  if(a[m]==v)
return m;(关键问题就出在这里了有木有!!!!!仔细想一下!)
  if(a[m]<v)
   l=m+1;
  else
   h=m;
}
return -1;
}
2,等于v的第一个值
int lower_bound(int a[],int l,int h,int v)
{
int m;
while(l<h)
{
  m=(l+h)>>1;
  if(a[m]>=v)
  {
   h=m;
  }
  else
  {
   l=m+1;
  }
}
if(v==arr[l])
{
  return l;
}
return -1;
}

折半查找其实还可以用来处理上下界问题
例如 求下界
int lower_bound(int a[],int l,int h,int v)
{
int m;
while(l<h)
{
  m=(l+h)>>1;
  if(a[m]>=v)
  {
   h=m;
  }
  else
  {
   l=m+1;
  }
}
return l;
}
求上界
int upper_bound(int a[],int l,int h,int v)
{
int m;
while(l<h)
{
  m=(l+h)>>1;
  if(a[m]>v)
  {
   h=m;
  }
  else
  {
   l=m+1;
  }
}
return l;
}
两个程序直接的差距其实就是等号所在的区域不同而已
最后补充一点
STL库中有专门的函数可以调用
如 upper_bound(a,a+n,v)
    lower_bound(a,a+n,v)

这篇关于折半查找——一不小心,又是一个坑。。。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093658

相关文章

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

Win8下如何快速查找和删除电脑中的病毒

Win8系统如何查找和删除病毒?检查你的电脑是否存在病毒的一种快速方法是使用 Windows Defender. 此恶意软件防护随 Windows 提供,可帮助识别和删除病毒、间谍软件和其他恶意软件。   注意:如果你使用的是 Windows RT,则 Windows Defender 会始终启用,并且不能关闭。   如果你使用的是 Windows 8,则可以根据自己的喜好运行由其他

nyoj 685 查找字符串

当初一开始没做出来。 后来,学习过一段时间之后,在返回来做这道题,忽然发现,map类容器可以做。 PS:需要注意的是:此题如果用c++的输入输出的话,会超时。 O(time):gets()<  scanf() < cin。   附上代码: #include<stdio.h>#include<map>#include<string>#include<string.h>usin

【C++二分查找】2439. 最小化数组中的最大值

本文涉及的基础知识点 C++二分查找 LeetCode2439. 最小化数组中的最大值 给你一个下标从 0 开始的数组 nums ,它含有 n 个非负整数。 每一步操作中,你需要: 选择一个满足 1 <= i < n 的整数 i ,且 nums[i] > 0 。 将 nums[i] 减 1 。 将 nums[i - 1] 加 1 。 你可以对数组执行 任意 次上述操作,请你返回可以得到的 n

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序

notepad++ 正则表达式多条件查找替换

基础语法参考: https://www.cnblogs.com/winstonet/p/10635043.html https://www.linuxidc.com/Linux/2019-05/158701.htm   通常情况下我们查找的内容和要被替换掉的内容是一样的,我们只需要使用正则表达式精确框定查找内容,替换直接输入要替换的内容即可。 但有时会比较复杂,查找的内容,只需要替换其中

【中等】保研/考研408机试-二分查找(模板题)

二分查找就是在一个有序数组中查找某个值,以首端尾端的中点mid查找对比,mid与要查找的数进行对比,看落在哪个区间,在那个区间重新得到首端和尾端,进而得到新的mid值。 一、模板题 二分查找-I_牛客题霸_牛客网 class Solution {public:int search(vector<int>& nums, int target) {int left=0,right=nums.s

vite是如何实现依赖预构建的,浏览器为什么没有实现从node_modules查找依赖,vite开发环境解决了什么问题

浏览器的esmodule 为什么没有做从node_modules查找依赖项 浏览器是基于http请求的,node_modules中依赖项不可控,可能又会依赖很多的包,整个依赖图都需要加载的话很耗性能。 commonjs是运行在服务端的,以file形式读取文件,内部有规避机制。 依赖预构建 首先vite会找到对应的依赖,然后调用esbuild(对js语法进行处理的一个库),将其他规范的代码转换

【AngularJS】字符查找

首先,在页面的控制器代码中添加一个名为“key”的属性,用于保存用户在文本框中输入的字符内容,该属性初始化时为空值。         然后,通过“ng-repeat”指令显示数据时,调用Angular中的“filter”过滤器,并添加一个对象性字符参数,指定在数据对象的“name”属性中查找“key”值,即在“姓名”属性中查找文本框输入的字符,如果找到,则显示在列表中,否则不显示

一不小心给桌面粘贴了1280个文件怎么办?

搞了一下午很混乱,慌乱中不小心将一个文件夹里的1280个包粘贴在了桌面上,         完后都没有撤销粘贴这个鼠标右键功能,反而还可以再粘贴。         很懵逼,只能把桌面上可以看见的多余文件删除,那么看不见的呢又拽不出来。         同时发现刷新桌面会很有明显的卡顿,说明那些文件确实还存在着,比之前的响应速度慢多了。         苦逼中去百度了一下然而