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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: (二分模板边界移动写法解析)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;
}
目录
相关文章
|
1月前
|
编译器 C++
【C++】模板进阶:深入解析模板特化
【C++】模板进阶:深入解析模板特化
|
2月前
|
C# Android开发 开发者
Uno Platform 高级定制秘籍:深度解析与实践样式和模板应用,助你打造统一且高效的跨平台UI设计
【9月更文挑战第7天】Uno Platform 是一个强大的框架,支持使用 C# 和 XAML 创建跨平台 UI 应用,覆盖 Windows、iOS、Android、macOS 和 WebAssembly。本文介绍 Uno Platform 中样式和模板的应用,助力开发者提升界面一致性与开发效率。样式定义控件外观,如颜色和字体;模板则详细定制控件布局。通过 XAML 定义样式和模板,并可在资源字典中全局应用或嵌套扩展。合理利用样式和模板能简化代码、保持设计一致性和提高维护性,帮助开发者构建美观高效的跨平台应用。
56 1
|
6月前
|
算法
二分查找及模板深度解析: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 ?
64 0
|
4月前
|
中间件 数据库 开发者
解析Python Web框架的四大支柱:模板、ORM、中间件与路由
【7月更文挑战第20天】Python Web框架如Django、Flask、FastAPI的核心包括模板(如Django的DTL和Flask的Jinja2)、ORM(Django的内置ORM与Flask的SQLAlchemy)、中间件(Django的全局中间件与Flask的装饰器实现)和路由(Django的urls.py配置与Flask的@app.route()装饰器)。这些组件提升了代码组织和数据库操作的便捷性,确保了Web应用的稳定性和可扩展性。
65 0
|
5月前
|
SQL 自然语言处理 前端开发
【JavaScript】ECMAS6(ES6)新特性概览(一):变量声明let与const、箭头函数、模板字面量全面解析
【JavaScript】ECMAS6(ES6)新特性概览(一):变量声明let与const、箭头函数、模板字面量全面解析
46 2
|
6月前
|
C++
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
|
6月前
|
程序员 编译器 C++
C++中的模板与泛型编程技术深度解析
C++中的模板与泛型编程技术深度解析
|
5月前
|
SQL 自然语言处理 JavaScript
【JavaScript】ECMAS6(ES6)新特性概览(一):变量声明let与const、箭头函数、模板字面量全面解析
ES6,作为ECMAScript 2015的简称,标志着JavaScript编程语言的一个重要进化节点。它不是渐进的变化,而是一次飞跃式的更新,为开发者带来了一系列强大的新特性与语法糖,极大提升了代码的简洁性、可读性和运行效率。从新的变量声明方式let与const,到优雅的箭头函数、模板字符串,再到让对象操作更为灵活的解构赋值与增强的对象字面量,ES6的每项改进都旨在让JavaScript适应日益复杂的应用场景,同时保持其作为脚本语言的活力与魅力。本文是深入探索这些核心特性的起点,为你铺开一条通向高效、现代JavaScript编程实践
66 0
|
6月前
|
SQL 缓存 JavaScript
深入解析JavaScript中的模板字符串
深入解析JavaScript中的模板字符串
80 1
|
6月前
项目管理工具计划模板解析:项目管理工具的双重功能与创建方法
本文介绍了项目计划模板的含义和重要性。项目计划模板是用于规划项目结构的可编辑文档,帮助团队明确任务、分配责任和管理时间。模板有助于跟踪项目进度、避免任务冲突,并简化会议安排。创建模板通常涉及选择合适的项目管理工具,如Zoho Projects或Microsoft Excel,然后分解任务、定义日期并持续调整。在Zoho Projects中,用户可以按步骤创建模板,包括命名、添加任务和设置相关细节。
76 0

推荐镜像

更多