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

  1. 题目链接
  2. 解题思路:题目意思就是,每个物品,有价格和美丽值,我现在有x钱,能买到的最大的美丽值是多少。最容易想到的就是,先按照价格排序,然后再二分法,找到小于等于x,最右侧的位置。但是这里有两个问题1)钱越多,美丽值越大?例如(1, 10), (2, 5),价格为2,美丽值反而变小了;2)相同的价钱怎么办?例如(3, 30), (3, 20),选哪个?
    • 我们可以先按照第一维度升序排,然后第二维度降序排
    • 然后将上述得到的数组,进一步筛选,要求,价格更高的,美丽值一定更大,价格相同的,只保留一个美丽值最大的。
  1. 代码

    class Solution:
        def maximumBeauty(self, items: List[List[int]], queries: List[int]) -> List[int]:
            items.sort(key=lambda l: (l[0], -l[1]))   # 第一维度升序,第二维度降序
            new_l = []
            cur_beauty = -1
            for item in items:
                if item[1] > cur_beauty:
                    new_l.append(item)
                    cur_beauty = item[1]
            ans = []
            for query in queries:
                # 找到小于等于query的   使用二分法
                L = 0
                R = len(new_l) - 1
                cur_ans = 0
    
                while L <= R :
                    middle = (L + R) // 2
                    if query == new_l[middle][0]:
                        cur_ans = new_l[middle][1]
                        break
                    elif query > new_l[middle][0]:
                        cur_ans = new_l[middle][1]
                        L = middle + 1
                    else:
                        R = middle - 1
                ans.append(cur_ans)
                
            return ans
    
posted @ 2025-03-09 17:10  ouyangxx  阅读(19)  评论(0)    收藏  举报