Leetcode每日一题(困难):1851. 包含每个查询的最小区间(2023.7.18 C++)

目录

1851. 包含每个查询的最小区间

题目描述:

实现代码与解析:

排序 + 哈希

原理思路:


1851. 包含每个查询的最小区间

题目描述:

        给你一个二维整数数组 intervals ,其中 intervals[i] = [lefti, righti] 表示第 i 个区间开始于 lefti 、结束于 righti(包含两侧取值,闭区间)。区间的 长度 定义为区间中包含的整数数目,更正式地表达是 righti - lefti + 1 。

再给你一个整数数组 queries 。第 j 个查询的答案是满足 lefti <= queries[j] <= righti 的 长度最小区间 i 的长度 。如果不存在这样的区间,那么答案是 -1 。

以数组形式返回对应查询的所有答案。

示例 1:

输入:intervals = [[1,4],[2,4],[3,6],[4,4]], queries = [2,3,4,5]
输出:[3,3,1,4]
解释:查询处理如下:
- Query = 2 :区间 [2,4] 是包含 2 的最小区间,答案为 4 - 2 + 1 = 3 。
- Query = 3 :区间 [2,4] 是包含 3 的最小区间,答案为 4 - 2 + 1 = 3 。
- Query = 4 :区间 [4,4] 是包含 4 的最小区间,答案为 4 - 4 + 1 = 1 。
- Query = 5 :区间 [3,6] 是包含 5 的最小区间,答案为 6 - 3 + 1 = 4 。

示例 2:

输入:intervals = [[2,3],[2,5],[1,8],[20,25]], queries = [2,19,5,22]
输出:[2,-1,4,6]
解释:查询处理如下:
- Query = 2 :区间 [2,3] 是包含 2 的最小区间,答案为 3 - 2 + 1 = 2 。
- Query = 19:不存在包含 19 的区间,答案为 -1 。
- Query = 5 :区间 [2,5] 是包含 5 的最小区间,答案为 5 - 2 + 1 = 4 。
- Query = 22:区间 [20,25] 是包含 22 的最小区间,答案为 25 - 20 + 1 = 6 。

提示:

  • 1 <= intervals.length <= 105
  • 1 <= queries.length <= 105
  • intervals[i].length == 2
  • 1 <= lefti <= righti <= 107
  • 1 <= queries[j] <= 107

实现代码与解析:

排序 + 哈希

class Solution {
public:vector<int> minInterval(vector<vector<int>>& itv, vector<int>& qr) {vector<int> res(qr.size(), -1);set<pair<int, int>> st;for (int i = 0; i < qr.size(); i++) st.insert({qr[i], i}); // <所求数字,编号>// 区间从小到大排 lambda表达式sort(itv.begin(), itv.end(), [&](const auto &a, const auto &b){return a[1] - a[0] < b[1] - b[0];});for (int i = 0; i < itv.size(); i++){auto it = st.lower_bound({itv[i][0], - 1}); //第一个大于等于左边界//找出左边界和右边界之间包含的查询for (it; it != st.end() && (it->first < itv[i][1] || it->first == itv[i][1]);){res[it->second] = itv[i][1] - itv[i][0] + 1; //查询编号,得到结果st.erase(it++);// 删除已经得到结果的que.防止下次覆盖,改变结果}}return res;}
};

原理思路:

        首先,按照区间大小对itv进行排序,然后利用set<pair<int ,int>>对qr进行排序,同时记录其编号,并且创建一个res数组,存放结果,初始化为 -1 。

        遍历itv,在set中找出第一个大于等于itv[i][0]的位置(左端点),然后开始遍历set中储存的询问,找出小于等于 itv[i][0](右端点)的询问,根据记录的编号位置,给对应位置的res赋值位区间长度,同时删除(set.erase)已经得到结果的询问,最终得到所有结果。

        注意一定不要把遍历set时的it++放入for()中,而是放入erase中。

        lower_bound(x) 是用来寻找第一个大于等于x的位置。

        upper_bound(x) 是用来寻找第一个大于x的位置。

不得不说在写仿函数的时候 lambda 写起来确实方便很多,学到了。

        一开始我写的丑陋代码,大家可以不用看,我自己记录一下,就过了4分之3,把qr排序来优化一下应该也可以过。

class Solution {
public:class mycomparison {public:bool operator()(const pair<int, int>& a, const pair<int, int>& b) {return a.first > b.first;}};vector<int> minInterval(vector<vector<int>>& intervals, vector<int>& queries) {vector<int> qr(10000010, -1); // 用于预处理vector<int> res; // 放结果priority_queue<pair<int ,int>, vector<pair<int, int>>, mycomparison> que; // pair<区间长度,编号>小堆,区间长度排序for (int i = 0; i < intervals.size(); i++){que.push({intervals[i][1] - intervals[i][0] + 1, i}); // pair<长度,编号>}while(que.size()){auto t = que.top();int len = t.first; // 区间长度int idx = t.second; // 此区间编号int r = intervals[idx][1]; // 右端点int l = intervals[idx][0]; // 左端点for (int i = l; i <= r; i++){if (qr[i] == -1){qr[i] = len;}}que.pop();}for (int i = 0; i < queries.size(); i++){res.push_back(qr[queries[i]]);}return res;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV——总结《车牌识别》

1.图片中的hsv hsv提取蓝色部分 # hsv提取蓝色部分 def hsv_color_find(img):img_copy img.copy()cv2.imshow(img_copy, img_copy)"""提取图中的蓝色部分 hsv范围可以自行优化cv2.inRange()参数介绍&#xff1a;第一个参数&#xff1a;hsv指的是原图第二个参…

初识vue3/setup/ ref()/ computed/watch/生命周期/父传子

创建项目先不着急学 main.js变了 新加setup reactive ref() computed watch 生命周期 父传子 子传父 ref/模板引用 暴露子组件属性 跨层传数据 defineOptions

用OpenCV进行图像分割--进阶篇

1. 引言 大家好&#xff0c;我的图像处理爱好者们&#xff01; 在上一篇幅中&#xff0c;我们简单介绍了图像分割领域中的基础知识&#xff0c;包含基于固定阈值的分割和基于OSTU的分割算法。这一次&#xff0c;我们将通过介绍基于色度的分割来进一步巩固大家的基础知识。 闲…

【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取

Spring的开发要点总结 文章目录 【JavaEE】Spring的开发要点总结&#xff08;1&#xff09;1. DI 和 DL1.1 DI 依赖注入1.2 DL 依赖查询1.3 DI 与 DL的区别1.4 IoC 与 DI/DL 的区别 2. Spring项目的创建2.1 创建Maven项目2.2 设置国内源2.2.1 勾选2.2.2 删除本地jar包2.2.3 re…

C++万字自学笔记

[TOC] 一、 C基础 C的IDE有CLion、Visual Studio、DEV C、eclipse等等&#xff0c;这里使用CLion进行学习。 0. C初识 0.1 第一个C程序 编写一个C程序总共分为4个步骤 创建项目创建文件编写代码运行程序 #include <iostream>int main() {using namespace std;cout…

提车自检手册(3系,其他车辆类似)

一、检查铭牌 1. 检查铭牌车辆生产日期&#xff0c;大于半年pass&#xff0c;玻璃、大灯、轮胎的生产日期不得大于车辆生产日期 二、检查轮胎 1. 是否全部为米其林轮胎 zp 4 防爆胎2. 检查全部轮胎日期&#xff0c;4个数字&#xff0c;后俩位年份&#xff0c;前俩位第几周 …

2.7 进制转换与mac

文章目录 2.7 进制转换与MAC进制转换MAC地址MAC地址与IP地址的关系总结 2.7 进制转换与MAC 进制转换 在计算机科学中&#xff0c;进制转换是将一个数值从一种进制表示转换为另一种进制表示的过程。常见的进制包括二进制&#xff08;base-2&#xff09;、十进制&#xff08;ba…

Vant源码解析(四)----Popup弹出层,详解样式方法

这个功能&#xff0c;自己也手写过&#xff0c;毕竟有很多弹窗的嘛。 我自己写就是&#xff1a;一个背景层&#xff0c;然后一个盒子里面放内容。再写个显示隐藏事件。够够的了。 Vant的Popup弹出层 页面结构 短短一个背景加内容盒子&#xff0c;vant套了几层。 这是引用的组件…

# Pytorch 深度卷积模型的特征可视化

Pytorch 深度卷积模型的特征可视化 1. 模型构建与可视化1.1 确定当前模型各层名称1.2 模型构建1.3 模型训练2. 训练过程可视化与特征图2.1 获取完整节点信息2.2 可视化参考文献资料1. 模型构建与可视化 1.1 确定当前模型各层名称 可视化模型的特征层需要打印各层的名称: 安装…

数据结构单向循环链表,创建以及增删改查的实现

一、单向循环链表的描述 循环链表&#xff1a;是另一种形式的链式存储结构。其特点是表中最后一个结点的指针域指向头节点&#xff0c;整个链表形成一个环。 单向循环链表的操作和单链表操作基本一致&#xff0c;差别在于&#xff1a;当链表遍历时&#xff0c;判别当前指针p是…

ChatGPT是否具有记忆能力?

ChatGPT在某种程度上具有记忆能力&#xff0c;但它的记忆能力有限且不像人类的记忆那样全面和持久。以下是对ChatGPT的记忆能力的详细分析&#xff1a; 1. 上下文记忆&#xff1a;ChatGPT可以在对话过程中记住先前的对话历史&#xff0c;以便更好地理解和回应后续的问题。通过…

vue+element Cascader 级联选择器 > 实现省市区三级联动

vueelement Cascader 级联选择器 > 实现省市区三级联动 先看下实现效果吧&#xff08;嘻嘻&#xff09; 看完我们就开始啦 安装element-china-area-data1 npm install element-china-area-data5.0.2 -S上代码 <el-cascadersize"large":options"options…

Http相关

Q&#xff1a;RESTful接口风格是什么&#xff1f; RESTful API 是一种基于 REST&#xff08;Representational State Transfer&#xff0c;表现层状态转移&#xff09;架构风格的 API 设计规范&#xff0c;它的核心思想是资源&#xff08;Resource&#xff09;和 HTTP 方法&am…

CRC校验原理全面解读

目录 1. 简介2. 原理2.1 CRC的发送与接收2.2 CRC校验码的生成2.3 CRC校验码的校验 3. 拓展问题3.1 模2除法为什么等同于异或运算&#xff1f;3.2 为什么除数的位数和被除数补充的位数相差为1&#xff1f;3.3 为什么CRC校验码不能纠正错误&#xff0c;只能检测错误&#xff1f; …

基于Selenium+Python的web自动化测试框架(附框架源码+项目实战)

目录 一、什么是Selenium&#xff1f; 二、自动化测试框架 三、自动化框架的设计和实现 四、需要改进的模块 五、总结 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 一、什么是Selenium&#xff1f; …

会员管理系统如何深度绑定用户?会员系统必备哪些功能?

在以消费者为主导的企业&#xff08;商家&#xff09;范围内&#xff0c;实行会员制管理能够更好的提升客户的忠诚度&#xff0c;减少客户的流失。完整、精确的会员管理系统&#xff0c;更能提升企业&#xff08;商家&#xff09;的实际效益。 蚓链会员管理系统(专业版) 便是这…

笔记:Nodejs 实时向 C++ 编译的可执行文件给予输入和获取输出

背景 我和几个同学当时想要去做一个多人联机的平面小游戏&#xff0c;但需要渲染视野。然而我们不会&#xff0c;只好请教大佬&#xff0c;而大佬不会 Javascript&#xff0c;所以他给我们的是 C 编译后的可执行文件&#xff0c;这就产生了延时。 原始方案 我当时写的是每一次…

02 QPushButton的基本使用

Tips: 在使用控件的时候如果没有智能提示&#xff0c;可能是没有包含头文件 在运行时&#xff0c;报【invalid use of xxx】可能是没有包含相关头文件 如果出现中文乱码&#xff1a;设置编译器的编码格式为UTF-8 本节主要包含创建一个按钮控件、显示按钮、设置按钮的父窗口、设…

Centos7安装Docker

Centos7安装Docker 目录 环境准备 安装Docker 启动Docker 切换源 启动第一个容器 环境准备 切换root权限 su root 升级所有包同时也升级软件和系统内核 yum -y update 卸载旧版本 yum remove docker docker-common docker-selinux docker-engine 卸载旧版本 yum rem…

UG\NX二次开发 捕获NX OPEN C++异常,乱码问题

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 捕获NX OPEN C++异常,乱码问题。 效果: 使用uc1601(ex.what(),1)显示乱码 使用 NXMessageBox()->Show("Block Styler", NXMessageBox::DialogTypeError, ex…