1.题目
2.思路(排序+二分查找)
首先,将每个物品(item)根据价格从大到小进行排序,再从0->n便利item,使每个tiem[i][1]都大于或者等于前面的item[][1]。最后,使用二分查找找到queries对应的物品价格,获取美丽值即可。注意:在这个地方,在价格相同时,每次都要获取靠后的美丽值。如【3,5】【3,6】【3,7】需要取【3,7】
p:用到一个排序的函数:
std::ranges::sort(items);
3.有关二分查找的一些思考
(1)为什么是left + (right - left +1 )/2 而不是(left + right)/2?因为后者会溢出
(2)为什么是left + (right - left +1 )/2 而不是 left + (right - left )/2?后者取的是靠后的美丽值,如【3,5】【3,6】【3,7】中的【3,5】
注意:当使用left + (right - left +1 )/2时:
if(items[mid][0]>value){
right = mid-1;
}else{
left = mid;
}
而当使用 left + (right - left )/2时:
if(items[mid][0]>=value){
right = mid;
}else{
left = mid+1;
}
e.g.
4.代码:
class Solution {
public:
int find(int value,vector<vector<int>>&items){
int left = 0,right = items.size()-1;
while(left<right){
int mid = left+(right-left+1)/2;
if(items[mid][0]>value){
right = mid-1;
}else{
left = mid;
}
}
cout<<value<<" "<<left<<endl;
cout<<items[left][1]<<endl;
return items[left][0]>value?0:items[left][1];
}
vector<int> maximumBeauty(vector<vector<int>>& items, vector<int>& queries) {
std::ranges::sort(items);
int n = items.size();
for(int i = 0;i<n;i++){
cout<<items[i][0]<<" "<<items[i][1]<<endl;
}
int max = items[0][1];
for(int i = 0;i<n;i++){
if(items[i][1]<max){
items[i][1] = max;
}else{
max = items[i][1];
}
}
int m = queries.size();
for(int i = 0;i<m;i++){
queries[i] = find(queries[i],items);
}
return queries;
}
};