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

111 阅读1分钟

题目:
给你一个二维整数数组 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
}