首页 > 编程语言 >2-3 改写二分搜索算法

2-3 改写二分搜索算法

时间:2023-05-25 17:01:38浏览次数:39  
标签:二分 rright right int scanf value 改写 num 搜索算法


设a[0 : n - 1]是已排好序的数组。请改写二分搜索算法,使得当搜索元素 x 不在数组中时,返回小于 x 的最大元素的位置 i 和大于 x 的最小元素位置 j。当搜索元素在数组中时,i 和 j 相同,均为 x 在数组中的位置。

测试数据(自己写的):

6
1
2
3
4
5
6
7
输出 :i = 5 , j = -1

6
1
2
3
4
5
6
-1
输出 :i = -1 , j = 0

6
1
2
3
5
6
7
4
输出 :i = 2 , j = 3

7
1
2
3
5
6
7
8
4

输出 :i = 2 , j = 3

//如果 i 或 j 不存在则其值为 -1;
#include <bits/stdc++.h>
using namespace std;
const int MAX = 100;
void BinarySearch_Changed(int *a, int value, int left, int right, int &i, int &j)
{
    int mid, rright = right, lleft = left;
    while(left <= right)
    {
        mid = (left + right) / 2;
        if(value == a[mid])
        {
            i = j = mid;
            return;
        }
        else if(value < a[mid])
        {
            right = mid - 1;
        }
        else
        {
            left = mid + 1;
        }
    }
    i = left - 1, j =  left;
    if(left  > rright)
        i = rright, j = -1;
    if(right < 0)
        i = -1, j = 0;

}
int main()
{
    int a[MAX];
    int i, j, num, value;
    scanf("%d", &num);
    for(int i = 0; i < num; ++i)
    {
        scanf("%d", &a[i]);
    }
    scanf("%d", &value);
    BinarySearch_Changed(a, value, 0, num - 1, i, j);
    printf("i = %d , j = %d", i, j);
}



标签:二分,rright,right,int,scanf,value,改写,num,搜索算法
From: https://blog.51cto.com/u_16129621/6350103

相关文章

  • day01【704. 二分查找,35.搜索插入位置 ,27. 移除元素 】
    704.二分查找二分查找理论二分查找是一个时间效率极高的算法,尤其是面对大量的数据时,其查找效率是极高,时间复杂度是log(n)。主要思想就是不断的对半折叠,每次查找都能除去一半的数据量,直到最后将所有不符合条件的结果都去除,只剩下一个符合条件的结果。二分查找需要的条件用于......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
    二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例2:输入:nums=[-1,0,3,......
  • 搜索算法
    //DPS(深度搜索)//n-皇后问题//方法一(与数字全排列相似)#include<bits/stdc++.h>usingnamespacestd;constintN=80;intn,res=0;charQ[N][N];boolcow[N],dg[N],rdg[N];//dg,rdg是对角线和反对角线,cow是列;voiddfs(intu){if(u==n){res++;......
  • maximum clique 1 (牛客多校) (转化为图论, 二分图的最大独立集)
    题面大意:给出N个数, 找出最大的子集size使得子集中,任意2个数的二进制下,每一位,至少有2位不同 思路:N只有5000,可以直接暴力建边,转化位图论2种建边方式:一种是能在一个集合的2个数,建一条边,(没有办法去处理这个问题)一种是不能在一个集合的就建一条......
  • 图解LeetCode——886. 可能的二分法(难度:中等)
    一、题目给定一组 n 人(编号为 1,2,...,n), 我们想把每个人分进任意大小的两组。每个人都可能不喜欢其他人,那么他们不应该属于同一组。给定整数n 和数组dislikes ,其中 dislikes[i]=[ai,bi] ,表示不允许将编号为ai 和  bi的人归入同一组。当可以用这种方法将所有人......
  • 二分法
    【二】二分法二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。二分法查找的思路如下:(1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。(2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域......
  • 【代码练习】一道题带你掌握二分查找
    二分查找解析:思路一:暴力解法,直接遍历,从头开始查找,如果找到直接返回下标,找不到返回-1。classSolution{public:intsearch(vector<int>&nums,inttarget){for(inti=0;i<nums.size();i++){if(nums[i]==target)......
  • 【代码随想录算法训练营第一天】704. 二分查找、27. 移除元素
    Day1-数组Leetcode704二分查找初解已经不记得二分查找了,遍历找O(n)其实也过了,只是借此复习一下二分,确实快很多。二分的前提条件题目里也都明示了:无重复,(从小到大)排序。我没有用到这个条件,自然时间复杂度高于最优解。看完解答我再看了一眼题目的标题,才知道是考BinarySearch嗯......
  • 二分查找的要点,区间能缩小为一个点
    二分查找的要点就是让目标区间不断缩小直至为一个点。这同样是一些分治算法的目标,比如快速排序,我们的目标是区间缩小为一个点,如果你不能理解这个问题,那么通常会在剩余最后两三个数的时候混乱。我们在二分查找的时候,要不断通过leftrightmid的更新去达到我们最终目标;如果我们的......
  • 线性查找和二分查找
    线性查找'''列表线性查找线性查找就是从列表起始位置一次查询,直到查询到目标值,或者遍历整个列表完毕才结算查找过程线性查找复杂度O(n),比较慢'''fromcall_timeimport*@call_timedefliner_search(list,value):forindex,elementinenumerate(list):......