(二分模板边界移动写法解析)789. 数的范围

简介: (二分模板边界移动写法解析)789. 数的范围

题目链接

789. 数的范围 - AcWing题库


一些话


切入点

给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。

对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。

       说明了此题是查数组里的元素位置,由此知道是要用二分,作为题目的切入点

流程

给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。


       说明题目给定的数组有序,不用再排序


对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)


       要查k区间的起始与终止,说明要写两段二分,一段f[mid] >= x,一段f[mid] <= x;


如果数组中不存在该元素,则返回 -1 -1。


       二分完还要再判断结果是否等于该元素,不等的话输出-1

套路

1.二分的写法判断:

       ①找x区间里的第一个位置:

               ㈠用f[mid] >= x,

f[mid]在x区间里时要让mid尽可能小,所以要移动右边界,对应r = mid


                       mid = l + r >> 1

  ㈡为什么不能用f[mid] <= x ?

                       前面说到,要让mid尽可能小,所以要移动右边界,如果用f[mid] <= x,只要开始移 动右边界,f[mid] 就永远小于 x,右边界会无限移动直到l < r的条件被打破。

       ②找x区间里的最后一个位置:

               ㈠用f[mid] <= x,

f[mid]在x区间里时要让mid尽可能大,所以要移动左边界,对应l = mid(此时mid要


                       写成l + r + 1 >> 1;


               ㈡为什么不能用f[mid] >= x?

                       同情况①,会出现左边界无限移动的情况

ac代码

// 6;57~7:06 ~ 46 accepted;
// 7:57 - 8 : 03
// 8:06~8:10
// 找第一个x,>= x,
// 最后一个x <= x 
// 第一个x左边一位 , < x
// 最后一个x右边一位, > x
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace  std;
const int N = 1e5 + 10;
int f[N];
int n;
int main(){
    cin >> n;
    int t;
    cin >> t;
    for(int i = 0;i < n;i++){
        scanf("%d",&f[i]);
    }
    while(t--){
        int x;
        scanf("%d",&x);
        int l = 0,r = n-1;
        while(l < r){
            int mid = l + r >> 1;
            if(f[mid] >= x) r = mid;
            else l = mid + 1;
        }
        if(f[l] == x) cout << l << " ";
        else cout << -1 << " ";
        r = n -1;
        while(l < r){
            int mid = l + r + 1 >> 1;
            if(f[mid] <= x) l = mid;
            else r = mid - 1;
        }
        if(f[l] == x) cout << l << endl;
        else cout << -1 << endl;
    }
    return 0;
}
目录
相关文章
|
2天前
|
机器学习/深度学习 算法 编译器
【C++ 泛型编程 中级篇】深度解析C++:类型模板参数与非类型模板参数
【C++ 泛型编程 中级篇】深度解析C++:类型模板参数与非类型模板参数
49 0
|
2天前
|
算法
二分查找及模板深度解析:right <= left 还是 right < left ? mid=left+(right-left)/2还是mid=left+(right-left +1 )/2 ?
二分查找及模板深度解析:right <= left 还是 right < left ? mid=left+(right-left)/2还是mid=left+(right-left +1 )/2 ?
29 0
|
2天前
|
设计模式 算法 数据安全/隐私保护
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
29 0
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
|
2天前
|
存储 算法 编译器
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(一)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
66 0
|
2天前
|
SQL 缓存 JavaScript
深入解析JavaScript中的模板字符串
深入解析JavaScript中的模板字符串
14 1
|
2天前
|
C++
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
|
2天前
项目管理工具计划模板解析:项目管理工具的双重功能与创建方法
本文介绍了项目计划模板的含义和重要性。项目计划模板是用于规划项目结构的可编辑文档,帮助团队明确任务、分配责任和管理时间。模板有助于跟踪项目进度、避免任务冲突,并简化会议安排。创建模板通常涉及选择合适的项目管理工具,如Zoho Projects或Microsoft Excel,然后分解任务、定义日期并持续调整。在Zoho Projects中,用户可以按步骤创建模板,包括命名、添加任务和设置相关细节。
21 0
|
2天前
|
存储 程序员 编译器
【C++ 模板类与虚函数】解析C++中的多态与泛型
【C++ 模板类与虚函数】解析C++中的多态与泛型
53 0
|
2天前
|
JSON C++ 数据格式
【C++ 泛型编程 进阶篇】深入解析C++中的std::conditional_t与std::void_t:模板编程的神器
【C++ 泛型编程 进阶篇】深入解析C++中的std::conditional_t与std::void_t:模板编程的神器
88 0
|
2天前
|
安全 编译器 程序员
【C++ 11 模板和泛型编程的应用以及限制】C++11 模板与泛型深度解析:从基础到未来展望
【C++ 11 模板和泛型编程的应用以及限制】C++11 模板与泛型深度解析:从基础到未来展望
82 0

推荐镜像

更多