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

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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值