首页 > 其他分享 >二分查找

二分查找

时间:2023-11-07 20:12:14浏览次数:27  
标签:二分 right int mid while 查找 left

一、二分查找

其本质就是找一个区间

二、整数二分

2.1. 查找左边界的模板

int findPrior(int left,int right,int target) {
	while (left < right) {
		int mid = (left + right) / 2;
		if (a[mid] >= target) right = mid;
		else left = mid + 1;
	}
	if (a[left] == target) return left;
	else return false;
}

2.2. 查找右边界模板

int findTail(int left, int right, int target) {
	while (left < right) {
		int mid = (left + right) / 2;
		if (a[mid] <= target) left = mid;
		else right = mid - 1;
	}
	if (a[left] == target) return left;
	return false;
}

2.2. 相关题目

#include<stdio.h>

int main() {
    int n;
    int q;
    int k;
    int a[100010];
    scanf("%d %d", &n, &q);
    for (int i = 0; i < n; i++)
        scanf("%d", a + i);
    while (q--) {
        scanf("%d", &k);
        int left = 0;
        int right = n;
        while (left < right) {
            int mid = (left + right) / 2;
            if (a[mid] >= k) right = mid;
            else left = mid + 1;
        }
        if (a[left] != k)
            printf("-1 -1\n");
        else {
            printf("%d ", left);
            left = 0; right = n - 1;
            while (left < right) {
                int mid = (left + right + 1) / 2;
                if (a[mid] <= k) left = mid;
                else right = mid - 1;
            }
            printf("%d\n", left);
        }
    }
}

三、浮点数二分

3.1. 相关题目

#include<stdio.h>
#include<math.h>

int main(){
    double n;
    scanf("%lf",&n);
    double left = -10000,right = 10000;
    while (right - left >= 1e-8) {
        double mid = (left + right) / 2;
        if (mid * mid * mid <= n) left = mid;
        else right = mid;
    }
    printf("%.6f",left);
    return 0;
}

标签:二分,right,int,mid,while,查找,left
From: https://www.cnblogs.com/cony1/p/17815833.html

相关文章

  • Linux p12 查找指令
    搜索查找指令find指令find指令将从指定目录向下递归的遍历其各个子目录,将满足条件的文件或者目录显示在终端。基本语法find[搜索范围(指定目录)][选项]选项说明选项功能-name<查询方式>按照指定的文件名查找模式查找文件-user<用户名>查找属于指定用户名......
  • 二叉查找树的实现C/C++
    二叉查找树是一种关键字有序存放的二叉树。在不含重复关键字的二叉查找树中,关键字"较小"的节点一定在关键字“较大”的节点的左子树中,“较小”一般可以由内值类型的<运算符来实现,或由重载了<运算符的类类型的<运算符来实现。“较小”的概念可以根据我们的需要有不同的实现。本文实......
  • L-4: 34--在排序数组中查找元素的第一个和最后一个位置
    给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1,-1]。你必须设计并实现时间复杂度为 O(logn) 的算法解决此问题。 示例1:输入:nums=[5,7,7,8,8,10],tar......
  • 查找数组中元素
    1.代码#include<stdio.h>intmain(){inta[6]={60,75,95,80,65,90},b;scanf("%d",&b);if(b!=a[0]&&b!=a[1]&&b!=a[2]&&b!=a[3]&&b!=a[4]&&b!=a[5]){printf("NotIncluded......
  • linux其他命令(查找,软链接,打包和压缩,软件安装)笔记
     1,查找文件 * 是通配符,代表任意字符,0到多个。find路径 -name "*.txt" :查找在路径下所有以.txt结尾的文件。 2,软链接  (1)将桌面目录下的1.txt移动到a/b/c目录下 (2)在桌面目录下新建1.txt的软链接1_xiangdui,使用相对路径 使用绝对路径 用......
  • 查找数组中元素
    作业要求输入一个固定长度的数组,并输入一个要查找的数,给出能不能检索到的伪代码并测试。伪代码Setfirstto0Setlasttolength-1SetfoundtoFALSEWHILE(first<=lastANDNOTfound)Setmiddleto(first+last)/2IF(itemequalsdat......
  • 查找数组中元素
    查找数组中元素任务详情输入一个固定长度的数组,并输入一个要查找的数,给出能不能检索到的伪代码并测试伪代码fact赋值为0输入长度为8的数组num输入想检索的数searchi赋值为0如果i不超过7{判断num[i]是否等于search等于则fact赋值为1并结束循环i赋值为i+1}如果fact为1......
  • L2-二分查找
    左闭右闭区间:(另一种为左闭右开区间)注意middle的取值classSolution{publicintsearch(int[]nums,inttarget){//首先关于(left+rigth)/2取舍问题:int类型数据作除法会舍去小数部分intleft=0;intright=nums.length-1;......
  • 二分查找总结
    不考虑重复元素下循环条件l<=rmid=(left+right)>>1(1)如果a[mid]=targetreturnmid(2)如果a[mid]<target搜索[mid+1,right](3)如果a[mid]>target搜索[left,mid-1]如果循环推出仍然没有找到,就标志着没有该元素。二分查找元素起始位置mid=(left+right)>>1需要找到一个......
  • 用二分法寻找第7位数(数组)
    #include<stdio.h>intmain(){  intk=7;  intarr[]={1,2,3,4,5,6,7,8,9,10};  intsz=sizeof(arr)/sizeof(arr[0]);    //元素个数的计算公式  intleft=0;                //左下标  intright=sz-1;  ......