【离线查询 滑动窗口】2747. 统计没有收到请求的服务器数目

devtools/2024/12/23 0:33:55/

本文涉及知识点

离线查询 C++算法滑动窗口总结

LeetCode2747. 统计没有收到请求的服务器数目

给你一个整数 n ,表示服务器的总数目,再给你一个下标从 0 开始的 二维 整数数组 logs ,其中 logs[i] = [server_id, time] 表示 id 为 server_id 的服务器在 time 时收到了一个请求。
同时给你一个整数 x 和一个下标从 0 开始的整数数组 queries 。
请你返回一个长度等于 queries.length 的数组 arr ,其中 arr[i] 表示在时间区间 [queries[i] - x, queries[i]] 内没有收到请求的服务器数目
注意时间区间是个闭区间。
示例 1:
输入:n = 3, logs = [[1,3],[2,6],[1,5]], x = 5, queries = [10,11]
输出:[1,2]
解释:
对于 queries[0]:id 为 1 和 2 的服务器在区间 [5, 10] 内收到了请求,所以只有服务器 3 没有收到请求。
对于 queries[1]:id 为 2 的服务器在区间 [6,11] 内收到了请求,所以 id 为 1 和 3 的服务器在这个时间段内没有收到请求。
示例 2:
输入:n = 3, logs = [[2,4],[2,1],[1,2],[3,1]], x = 2, queries = [3,4]
输出:[0,1]
解释:
对于 queries[0]:区间 [1, 3] 内所有服务器都收到了请求。
对于 queries[1]:只有 id 为 3 的服务器在区间 [2,4] 内没有收到请求。
提示:
1 <= n <= 105
1 <= logs.length <= 105
1 <= queries.length <= 105
logs[i].length == 2
1 <= logs[i][0] <= n
1 <= logs[i][1] <= 106
1 <= x <= 105
x < queries[i] <= 106

滑动窗口+离线查询

一,logs按time升序排序。
二,queries按升序排序。
三:通过que枚举queries。
time小于等于que进入滑动窗口
time小于que-x离开滑动窗口
滑动窗口
小根堆记录{time,serverid}
哈希映射记录有消息的服务器数量。
n - 有消息的服务器数量 就是答案。
注意:不能对queries排序,对其下标排序。

代码

核心代码


template<class KEY>
class CKeyCount
{
public:void Add(const KEY& key, int iCount){Cnt[key] += iCount;if (0 == Cnt[key]){Cnt.erase(key);}}std::unordered_map<KEY, int> Cnt;
};class Solution {
public:vector<int> countServers(int n, vector<vector<int>>& logs, int x, vector<int>& queries) {sort(logs.begin(), logs.end(), [](const vector<int>& v1, const vector<int>& v2) {return v1[1] < v2[1]; });vector<int> indexs(queries.size());iota(indexs.begin(), indexs.end(), 0);sort(indexs.begin(), indexs.end(), [&](int i1, int i2) {return queries[i1] < queries[i2]; });priority_queue<pair<int, int>, vector< pair<int, int>>, std::greater<>> heap;CKeyCount<int> cnt;vector<int> ret(indexs.size());int i = 0;for (int j : indexs) {auto que = queries[j];while ((i < logs.size()) && (logs[i][1] <= que)) {cnt.Add(logs[i][0], 1);				heap.emplace(logs[i][1], logs[i][0]);i++;}while (heap.size() && (heap.top().first < que - x)) {cnt.Add(heap.top().second, -1);heap.pop();}ret[j] = n - cnt.Cnt.size();}return ret;}
};

单元测试

template<class T1, class T2>
void AssertEx(const T1& t1, const T2& t2)
{Assert::AreEqual(t1, t2);
}
void AssertEx( double t1,  double t2)
{auto str = std::to_wstring(t1) + std::wstring(1,32) + std::to_wstring(t2);Assert::IsTrue(abs(t1 - t2) < 1e-5,str.c_str() );
}template<class T>
void AssertEx(const vector<T>& v1, const vector<T>& v2)
{Assert::AreEqual(v1.size(), v2.size());for (int i = 0; i < v1.size(); i++){Assert::AreEqual(v1[i], v2[i]);}
}template<class T>
void AssertV2(vector<vector<T>> vv1, vector<vector<T>> vv2)
{sort(vv1.begin(), vv1.end());sort(vv2.begin(), vv2.end());Assert::AreEqual(vv1.size(), vv2.size());for (int i = 0; i < vv1.size(); i++){AssertEx(vv1[i], vv2[i]);}
}namespace UnitTest
{int n;vector<vector<int>> logs;int x;vector<int> queries;TEST_CLASS(UnitTest){public:TEST_METHOD(TestMethod00){n = 3, logs = { {1,3},{2,6},{1,5} }, x = 5, queries = { 10,11 };auto res = Solution().countServers(n, logs, x, queries);AssertEx(vector<int>{1, 2}, res);}TEST_METHOD(TestMethod01){n = 3, logs = { {2,4},{2,1},{1,2},{3,1} }, x = 2, queries = { 3,4 };auto res = Solution().countServers(n, logs, x, queries);AssertEx(vector<int>{0,1}, res);}};
}

扩展阅读

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关推荐

我想对大家说的话
《喜缺全书算法册》以原理、正确性证明、总结为主。
按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。


http://www.ppmy.cn/devtools/103261.html

相关文章

【ceph学习】ceph如何进行数据的读写(1)

版本 ceph版本为17. ceph如何进行读写接口的实现 Ceph的客户端通过librados的接口进行集群的访问&#xff0c;这里的访问包括&#xff1a; 1&#xff09;对集群的整体访问 2&#xff09;对象的访问 两类接口&#xff0c;这套接口&#xff08;API&#xff09;包括C、C和Pytho…

Ruby 多线程

Ruby 多线程 在当今的软件开发领域,多线程已经成为提高程序性能和响应速度的关键技术之一。Ruby,作为一种现代的编程语言,提供了丰富的多线程支持,使得开发者能够轻松地构建高效、并发的应用程序。本文将深入探讨Ruby中的多线程概念、用法以及最佳实践。 什么是多线程? …

图像搜索引擎DIY【CLIP+FAISS】

你是否曾经想在无穷无尽的图像数据集中查找图像&#xff0c;但发现这太过繁琐&#xff1f;在本教程中&#xff0c;我们将构建一个图像相似性搜索引擎&#xff0c;以便使用文本查询或参考图像轻松查找图像。为方便起见&#xff0c;本文底部以 Colab 笔记本的形式提供了本教程的完…

PyAutoGui的使用

文章目录 一、屏幕1.获取屏幕分辨率2.查看指定位置的像素点是否在屏幕上 二、鼠标1.获取鼠标位置2.控制鼠标运动3.鼠标拖动4.鼠标点击5.鼠标的按压与释放6.鼠标滚动 三、键盘1.控制键盘2.按下后释放一个键3.按顺序按下键&#xff0c;然后反向顺序释放 四、图像1.截图2.获取图像…

【TPAMI 2024】Occlusion-Aware Self-Supervised Monocular 6D Object Pose Estimation

TPAMI 2024 | 我3D都没搞明白&#xff0c;这都开始6D了&#xff01;&#xff1f;而且这个单目6D物体姿态估计技术&#xff0c;让机器视觉无需人类教导&#xff01; Occlusion-Aware Self-Supervised Monocular 6D Object Pose Estimation 题目&#xff1a;遮挡感知的自监督单…

音视频-图像篇(YUV和RGB)

文章目录 一、图像基础概念二、YUV与RGB1.YUV分类方式2.YUV“空间-间”的数据划分1&#xff09;UV按照“空间-间”的划分方式&#xff0c;分为YUV444、YUV422、YUV4202&#xff09;YUV“空间-内”的数据划分 3.RGB 三、比较JPG、PNG、GIF、BMP图片格式 一、图像基础概念 像素&…

(自用)适时小结(一)

前言 每过一段时间,总结一下学习方面的感悟,可能和编程有关,可能和学习方法有关,也可能对前面学过东西的回顾,或者单纯表达一些想法. 关于C C的学习至少要经过两个阶段:基础学习和熟练掌握.常见的问题:学习的过程中会产生一些迷茫,C到底能干什么? .C的内容不少,学习难度也不低…

Redis过期键监听

在 Redis 中&#xff0c;为了监听过期键事件&#xff0c;需要使用 Redis 的 Keyspace Notifications 功能。这一功能允许客户端订阅某些事件的发生&#xff0c;比如键过期、键删除等。 启用过期键监听 在 Redis 的配置文件 redis.conf 中&#xff0c;确保配置项 notify-keysp…