2070. 每一个查询的最大美丽值 - 力扣(LeetCode)


可以使用排序 + 前缀最大值 + 二分查找来高效解决这个问题。具体思路如下:
-
对物品进行排序:
- 按照价格
price进行升序排序,如果价格相同,可以忽略美丽值的排序(因为后续会计算前缀最大值)。
- 按照价格
-
构建前缀最大美丽值数组:
- 维护一个
max_beauty变量,用于记录当前遇到的最大美丽值。 - 依次遍历排序后的物品列表,并更新
max_beauty,存储到新的数组sorted_items中,格式为[price, max_beauty]。
- 维护一个
-
使用二分查找来处理查询:
- 对
queries进行遍历,每个查询q需要找到sorted_items中价格小于等于q的最大美丽值。 - 由于
sorted_items已经按price递增排序,可以使用 二分查找(bisect_right)快速定位q适用的最大索引idx,然后返回对应的最大美丽值。
- 对
代码实现(Python)
from bisect import bisect_right
def maximumBeauty(items, queries):
# 按照价格排序,如果价格相同可以忽略美丽值的排序
items.sort()
# 处理前缀最大美丽值
sorted_items = []
max_beauty = 0
for price, beauty in items:
max_beauty = max(max_beauty, beauty)
sorted_items.append((price, max_beauty))
# 结果数组
answer = []
# 处理每个查询
for q in queries:
# 使用二分查找找到第一个 price > q 的索引
idx = bisect_right(sorted_items, (q, float('inf'))) - 1
if idx >= 0:
answer.append(sorted_items[idx][1])
else:
answer.append(0) # 没有满足条件的物品
return answer
复杂度分析
- 排序 items: O(NlogN),其中 NN 是
items的大小。 - 构建前缀最大值: O(N)。
- 二分查找: 每次查询 O(logN),共 Q 次查询,总复杂度 O(QlogN)。
- 总复杂度: O(NlogN+QlogN)。
示例
items = [[1,2], [3,2], [2,4], [5,6], [10,8]]
queries = [3, 6, 10]
print(maximumBeauty(items, queries)) # 输出 [4, 6, 8]
这段代码能高效处理查询,并确保查询能够快速找到符合条件的最大美丽值。
1534

被折叠的 条评论
为什么被折叠?



