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

浙公网安备 33010602011771号