【二分查找 离线查询】2070. 每一个查询的最大美丽值

本文涉及的基础知识点

C++二分查找
离线查询

LeetCode2070. 每一个查询的最大美丽值

给你一个二维整数数组 items ,其中 items[i] = [pricei, beautyi] 分别表示每一个物品的 价格 和 美丽值 。
同时给你一个下标从 0 开始的整数数组 queries 。对于每个查询 queries[j] ,你想求出价格小于等于 queries[j] 的物品中,最大的美丽值 是多少。如果不存在符合条件的物品,那么查询的结果为 0 。
请你返回一个长度与 queries 相同的数组 answer,其中 answer[j]是第 j 个查询的答案。
示例 1:
输入:items = [[1,2],[3,2],[2,4],[5,6],[3,5]], queries = [1,2,3,4,5,6]
输出:[2,4,5,5,6,6]
解释:

  • queries[0]=1 ,[1,2] 是唯一价格 <= 1 的物品。所以这个查询的答案为 2 。
  • queries[1]=2 ,符合条件的物品有 [1,2] 和 [2,4] 。
    它们中的最大美丽值为 4 。
  • queries[2]=3 和 queries[3]=4 ,符合条件的物品都为 [1,2] ,[3,2] ,[2,4] 和 [3,5] 。
    它们中的最大美丽值为 5 。
  • queries[4]=5 和 queries[5]=6 ,所有物品都符合条件。
    所以,答案为所有物品中的最大美丽值,为 6 。
    示例 2:

输入:items = [[1,2],[1,2],[1,3],[1,4]], queries = [1]
输出:[4]
解释:
每个物品的价格均为 1 ,所以我们选择最大美丽值 4 。
注意,多个物品可能有相同的价格和美丽值。
示例 3:

输入:items = [[10,1000]], queries = [5]
输出:[0]
解释:
没有物品的价格小于等于 5 ,所以没有物品可以选择。
因此,查询的结果为 0 。

提示:
1 <= items.length, queries.length <= 105
items[i].length == 2
1 <= pricei, beautyi, queries[j] <= 109

C++二分查找

如果物品a相比物品b:贵且美丽值低,那么a被淘汰。淘汰后,美丽值高的价格高。即价格<=que中,价格最高的物品,便是选择的物品。如果有键值皆有序的模板,直接使用。
将items按物品价格升序排序。从1到n-1预处理items
MaxSelf(items[i][1],&items[i-1][1])
预处理后:items的价格 美丽值都是升序。
对第i个查询:it是第个一价格大于que[i]迭代器。–it就是选择的物品。

离线查询

一,对物品排序,时间复制度O(nlogn)。
二,对查询的下标indexs,按queries[i]升序排序。时间复制度O(mlogm)。
三,通过inx枚举indexs,while(items[i][0] <= queries[inx] )
{
cur = max(cur,items[i][1])
i++
}
ret[inx] = cur
由于i不复位,第三步时间复杂度是:O(n)。

代码

二分查找代码

	class Solution {
		public:
			vector<int> maximumBeauty(vector<vector<int>>& items, vector<int>& queries) {
				sort(items.begin(), items.end());
				for (int i = 1; i < items.size(); i++) {
					items[i][1] = max(items[i-1][1], items[i][1]);
				}
				vector<int> ret;
				for (const auto& que : queries) {
					auto it = std::upper_bound(items.begin(), items.end(),que, [&](const int& n, const vector<int>& v) {return n <v[0]; });
					ret.emplace_back((items.begin() == it) ? 0 : (--it)->back());
				}
				return ret;
			}
		};

单元测试

vector<vector<int>> items;
		vector<int> queries;
	
		TEST_METHOD(TestMethod11)
		{
			items = { {1,2},{3,2},{2,4},{5,6},{3,5} }, queries = { 1,2,3,4,5,6 };
			auto res = Solution().maximumBeauty(items, queries);
			AssertEx({ 2,4,5,5,6,6 }, res);
		}
		TEST_METHOD(TestMethod12)
		{
			items = { {1,2},{1,2},{1,3},{1,4} }, queries = { 1 };
			auto res = Solution().maximumBeauty(items, queries);
			AssertEx({ 4 }, res);
		}
		TEST_METHOD(TestMethod13)
		{
			items = { {10,1000} }, queries = { 5 };
			auto res = Solution().maximumBeauty(items, queries);
			AssertEx({ 0 }, 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++**实现。

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闻缺陷则喜何志丹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值