Leetcode每日一题练习 ------ 2070. 每一个查询的最大美丽值

Leetcode 每日一题练习继续讨论:

2070. 每一个查询的最大美丽值
2070. Most Beautiful Item for Each Query

题解

本题要求对每个query,不大于该query的price能得到的最大beauty是多少。则一定需要在items中查找满足不大于query的price最大是多少,查找无疑使用经典的二分查找,二分查找需要数组是有序的,因此需要给items排序,排序后,考虑items中存在相同price对应不同的beauty,并且有可能更小的price却能得到更大的beauty,故遍历一遍有序items在过滤掉重复的price的同时,将每个price对应的beauty设置为不大于该price的所有price中能得到的beauty的最大值。再根据query的值对price二分查找,找到不大于query的最大price,其对应的beauty即为该query对应的beauty。

代码

class Solution {
public:
    vector<int> maximumBeauty(vector<vector<int>>& items, vector<int>& queries) {
        sort(items.begin(), items.end());
        
        vector<vector<int>> newitems;
        int lastprice = 0;
        int maxbeauty = 0;
        
        for (auto &item : items) {
            if (item[0] != lastprice) {
                newitems.emplace_back(item);
                lastprice = item[0];
            }
            if (maxbeauty < item[1]) {
                maxbeauty = item[1];
            }
            newitems.back()[1] = maxbeauty;
        }
        
        vector<int> sols;
        sols.reserve(queries.size());
        
        for (int query : queries) {
            // 手动实现二分查找,找到第一个价格大于查询值的位置
            int left = 0;
            int right = newitems.size();
            while (left < right) {
                int mid = left + (right - left) / 2;
                if (newitems[mid][0] <= query) {
                    left = mid + 1;
                } else {
                    right = mid;
                }
            }
            
            if (left == 0) {
                sols.push_back(0);
            } else {
                sols.push_back(newitems[left - 1][1]);
            }
        }
        
        return sols;
    }
};

总结

其实过滤重复的price对本题影响不大,即使有重复的price也不影响二分查找最终找到的最大的满足条件的price和其对应的最大beauty,因此可以直接修改有序items数组,仅修改每个item的beauty为不大于该price的最大beauty即可

class Solution {
public:
    vector<int> maximumBeauty(vector<vector<int>>& items, vector<int>& queries) {
        sort(items.begin(), items.end());
        
        int maxbeauty = 0;
        for (auto &item : items) {
            if (maxbeauty < item[1]) {
                maxbeauty = item[1];
            }
            item[1] = maxbeauty;
        }
        
        vector<int> sols;
        
        for (int query : queries) {
            // 手动实现二分查找,找到第一个价格大于查询值的位置
            int left = 0;
            int right = items.size();
            while (left < right) {
                int mid = left + (right - left) / 2;
                if (items[mid][0] <= query) {
                    left = mid + 1;
                } else {
                    right = mid;
                }
            }
            
            if (left == 0) {
                sols.push_back(0);
            } else {
                sols.push_back(items[left - 1][1]);
            }
        }
        
        return sols;
    }
};
4 个赞

来了,刷题佬!

1 个赞

感谢你的分享

1 个赞

来了,刷题佬

1 个赞

来了,刷题佬!

1 个赞

感谢分享。。。。。

1 个赞