Featured image of post 1499. 满足不等式的最大值

1499. 满足不等式的最大值

题目描述

给你一个数组 points 和一个整数 k 。数组中每个元素都表示二维平面上的点的坐标,并按照横坐标 x 的值从小到大排序。也就是说 points[i] = [xi, yi] ,并且在 1 <= i < j <= points.length 的前提下, xi < xj 总成立。

请你找出 yi + yj + |xi - xj| 的 最大值,其中 |xi - xj| <= k 且 1 <= i < j <= points.length。

题目测试数据保证至少存在一对能够满足 |xi - xj| <= k 的点。

示例 1:

  • 输入:points = [[1,3],[2,0],[5,10],[6,-10]], k = 1
  • 输出:4
  • 解释:前两个点满足 |xi - xj| <= 1 ,代入方程计算,则得到值 3 + 0 + |1 - 2| = 4 。第三个和第四个点也满足条件,得到值 10 + -10 + |5 - 6| = 1 。 没有其他满足条件的点,所以返回 4 和 1 中最大的那个。

示例 2:

  • 输入:points = [[0,0],[3,0],[9,2]], k = 3
  • 输出:3
  • 解释:只有前两个点满足 |xi - xj| <= 3 ,代入方程后得到值 0 + 0 + |0 - 3| = 3 。

提示:

  • 2 <= points.length <= 10^5
  • points[i].length == 2
  • -10^8 <= points[i][0], points[i][1] <= 10^8
  • 0 <= k <= 2 * 10^8
  • 对于所有的 1 <= i < j <= points.length ,points[i][0] < points[j][0] 都成立。也就是说,xi 是严格递增的。

解法一:优先队列

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
type PriorityQueue struct {
    arr [][2]int
}

func (pq *PriorityQueue) Len() int {
    return len(pq.arr)
}

func (pq *PriorityQueue) Swap(i, j int) {
    pq.arr[i], pq.arr[j] = pq.arr[j], pq.arr[i]
}

func (pq *PriorityQueue) Push(x interface{}) {
    pq.arr = append(pq.arr, x.([2]int))
}

func (pq *PriorityQueue) Pop() interface{} {
    a := pq.arr
    ret := a[len(a)-1]
    pq.arr = a[:len(a)-1]
    return ret
}

func (pq *PriorityQueue) Less(i, j int) bool {
    return pq.arr[i][0] > pq.arr[j][0]
}

func max(nums ...int) int {
    ans := nums[0]
    for _, num := range nums {
        if num > ans {
            ans = num
        }
    }
    return ans
}

func findMaxValueOfEquation(points [][]int, k int) int {
    ans := math.MinInt32
    queue := &PriorityQueue{}
    heap.Push(queue, [2]int{points[0][1] - points[0][0], points[0][0]})
    for i := 1; i < len(points); i++ {
        x, y := points[i][0], points[i][1]
        for queue.Len() > 0 && x-queue.arr[0][1] > k {
            heap.Pop(queue)
        }
        if queue.Len() > 0 {
            ans = max(ans, x+y+queue.arr[0][0])
        }
        heap.Push(queue, [2]int{y - x, x})
    }
    return ans
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2023/07/21 14:48:27
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计