二分查找找一个数所在的范围

#include<iostream>

using namespace std;

//选好二分法的策略 ,二分查找找到一个数所在的范围 比如 2,4,8,12,15,20,23,56,79,90 16的范围就是15 20

/**找到比key大的第一个数,比key大的最小数**/

int findRight(int data[],int low,int high,int key)

{

int up=high;

int mid;

while(low<high)

{

mid=(low+high)/2;

if(data[mid]<=key)

low=mid+1;//要搜索的答案必须比key大,所以下界肯定在mid的右边

else

high=mid; //key<data[mid]答案可能就是在mid,或者在mid的左边,尽量小的数,往左去

}

if((high==low)&&(high==up)&&(key>data[up]) )

//    extern unsigned int strlen(char *s); 直到碰到第一个字符串结束符‘\0‘为止,然后返回计数器值(长度不包含"\0")。

return -1;

else

return low;

}

//找到比key小的最大数

int findLeft(int data[],int low,int high,int key)

{

int down=low;

if(key<data[down])//根据不同的源数据情况,两个出口皆有可能, 只能提前判断

return -1;

int mid;

while(low+1!=high&&low!=high)//有两个出口

{

mid=(low+high)/2;

if(data[mid]>=key)

high=mid-1;//要搜索的答案必须比key小,所以下界肯定在mid的左边

else

low=mid; //key>data[mid]答案可能就是在mid,或者在mid的右边,尽量往右去,找大的数

}

if(low+1==high)//如果不加这个就会出现死循环

{

if(key>data[high])

return high;

else if(key>data[low])

return low;

}

else

if(low==high)

return low;

}

int main()

{

int data[]= {2,4,8,12,15,20,23,56,79,90};//测测边界值

//    int key;

//    cout<<"请输入数字;";

//    cin>>key;

//    cout<<endl;

//    int larger=findRight(data,0,5,key);

//    if(larger==-1)

//        cout<<"您输入的数字太大!"<<endl;

//    else

//        cout<<"右界为: "<<data[larger]<<endl;

int key2;

cout<<"请输入数字;";

cin>>key2;

cout<<endl;

int smaller=findLeft(data,0,9,key2);

if(smaller==-1)

cout<<"您输入的数字太小!"<<endl;

else

cout<<"左界为: "<<data[smaller]<<endl;

return 0;

}

时间: 2024-10-14 16:09:48

二分查找找一个数所在的范围的相关文章

java二分查找举例讨论

最近做笔试题有这么一个关于二分查找的例子,有些疑惑. 给一个有序数组,和一个查找目标,用二分查找找出目标所在index,如果不存在,则返回-1-(其应该出现的位置),比如在0,6,9,15,18中找15,返回3:找10.则返回-4(-1-3) 实现如下: public class Sulution1 { public static void main(String[] args) { System.out.println(findBySep(2, new int[]{0,2,4,6,9}));

剑指offer——面试题38:数字在排序数组中出现的次数(利用二分查找来找第一次和最后一次的位置)

题目: 统计一个数字在排序数组中出现的次数. 思路: 因为是排好序的数组,所以可以采用二分查找的算法. 一般最容易想到的思路是采用二分查找先找到一个,然后往他左右两边遍历,但是这个方法由于在n个数组中还可能有n个k,所以 查找的复杂度还是O(n) 可以先用二分查找算法找到第一个出现的位置,即当找到一个时,看它前面一个是否也是k或者是否已经是查找这段的第一个了 然后同样用二分查找找最后一个出现的位置. 1 #include<iostream> 2 #include<vector> 3

二分查找原理和实现

前言 的确,我一开始的时候也认为二分查找挺简单的,但是在我对二分查找进行总结的时候,发现虽然思路很简单,但是代码要写的正确就不容易了. 区间 需要注意的是 注意计算的区间是左闭右开区间[)还是左闭右闭区间[],两者的代码是不太一样的. 左闭右闭区间 如果说你使用的是左闭右闭区间: int search3(int array[], int n, int target) { int left = 0; int right = n - 1; //比如说只有一个情况下 while (left <= ri

LintCode刷题---二分查找

描述: 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开         始),如果target不存在于数组中,返回-1. 样例 : 输入: [1, 2, 3, 3, 4, 5, 10], 3 输出: 2 样例解释:  3 第一次出现在第2个 解题: 难点分析: 注意数组中存在着重复数据, 而利用二分查找找出来的数据不一定是第一个, 数据需要检验. public int binarySearch(int[] nums,

LintCode_14 二分查找

题目 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. 样例 在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2. 思路 二分查找  找3,返回为2/3 都可以查找到 值得注意的是这道题需要返回边界值, 只能返回2才正确 C++代码 int binarySearch(vector<int> &array, int target) { //

bestcoder#43 1002 在数组中找两个数的和取模的最大值 二分

bestcoder#43 1002 在数组中找两个数的和取模的最大值  二分 pog loves szh II Accepts: 97 Submissions: 834 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description Pog and Szh are playing games. There is a sequence with n number

找数字(递归,二分查找)

题目:在一从大到小排序的序列中用递归找一个数在不在这序列,在输出yes,不在输出no 这题用了二分查找的递归实现 思路: 把数组和变量都变成全局变量方便递归函数修改 然后如果不可能就跳出循环 如果可能但现在没找到就缩小范围进入下一个递归过程 如果找到了就输出 代码: #include<bits/stdc++.h> using namespace std; int a[1000]; int n,key; int finder(int l,int r)//左和右 { if(l>r) { co

算法学习一~分治法~二分查找,快速的找~

现在编程也算是走上门了,但是没有把算法掌握下来只能说自己还是门外汉,所以以后我们就开始努力的学习算法,现在把自己每天的学习分享在这里希望大家能喜欢,并且我也要在这里整理我一天的学习和思路,. 二分查找..大家经常需要在一个数组中寻找某个值.如果是一个已经拍好序的话那么可以很快的找到.我们考虑下暴力查找,就是a[n],中找一个m,那么最好时是o(1),最差时是0(n),最终平均情况就是长度n/2.这样的时间复杂度不算很高但是可以改进到logn的级别. 1 #include<stdio.h>//算

usaco No Change, 2013 Nov 不找零(二分查找+状压dp)

Description 约翰带着 N 头奶牛在超市买东西,现在他们正在排队付钱,排在第 i 个位置的奶牛需要支付 Ci 元.今天说好所有东西都是约翰请客的,但直到付账的时候,约翰才意识到自己没带钱,身上只有 K 张消费卡,第 i 张卡里有 Vi 元余额. 问题是,这些消费卡都是一次性的,它们可以被收银机读取,但如果卡一旦离开了收银机,卡里 的余额就会归零,而且超市也不负责找零!奶牛的队伍很长,不可能再调整她们的位置了,所以一张 卡只能支付一段连在一起的账单.而且,一张账单只能用一张消费卡支付,超