题目:
给你一个二维整数数组 items ,其中 items[i] = [pricei, beautyi] 分别表示每一个物品的 价格 和 美丽值 。
同时给你一个下标从 0 开始的整数数组 queries 。对于每个查询 queries[j] ,你想求出价格小于等于 queries[j] 的物品中,最大的美丽值 是多少。如果不存在符合条件的物品,那么查询的结果为 0 。
请你返回一个长度与 queries 相同的数组 **answer,其中 **answer[j]是第 j 个查询的答案。
算法:
方法一:排序+二分。
思路:
1.先按照价格升序排序。
2.查找小于等于价格的商品最大美丽值。
问题在于存在价格相同的商品,它们的美丽值在排序后的数组中是无序的。如何找到价格小于等于 queries[j] 的物品中,最大的美丽值。
我们构造商品的美丽值为价格小于等于它的商品的最大美丽值:items[i][1] = max(items[i][1], items[i - 1][1]),通过二分查找定位items中价格大于querys[j]的商品index之后,items[index - 1][1] 即是所求。
func maximumBeauty(items [][]int, queries []int) []int {
sort.Slice(items, func(i, j int) bool {
return items[i][0] < items[j][0]
})
n := len(items)
for i := 1; i < len(items); i ++ {
items[i][1] = max(items[i][1], items[i - 1][1])
}
var query func(v int) int
query = func(v int) int {
left, right := 0, n
for left < right {
mid := left + (right - left) / 2
if items[mid][0] > v {
right = mid
} else {
left = mid + 1
}
}
if left == 0 {
return 0
}
return items[left - 1][1]
}
ans := make([]int, len(queries))
for i := range queries {
ans[i] = query(queries[i])
}
return ans
}
func max(a, b int) int {
if a > b {
return a
}
return b
}