本文涉及的基础知识点
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++**实现。