1499. 满足不等式的最大值 详解

1499. 满足不等式的最大值

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

请你找出 y i + y j + ∣ x i − x j ∣ y_i + y_j + |x_i - x_j| yi+yj+xixj 的 最大值,其中 ∣ x i − x j ∣ < = k |xi - xj| <= k xixj<=k 1 < = i < j < = p o i n t s . l e n g t h 1 <= i < j <= points.length 1<=i<j<=points.length

题目测试数据保证至少存在一对能够满足 ∣ x i − x j ∣ < = k |x_i - x_j| <= k xixj<=k的点。


捕捉题干信息我们发现:

  • 1 < = i < j < = p o i n t s . l e n g t h 1 <= i < j <= points.length 1<=i<j<=points.length 的前提下, x i < x j x_i < x_j xi<xj 总成立。 ①
  • 找出 y i + y j + ∣ x i − x j ∣ y_i + y_j + |x_i - x_j| yi+yj+xixj 的 最大值,其中 ∣ x i − x j ∣ ≤ k |x_i - x_j| \leq k xixjk 1 ≤ i < j ≤ p o i n t s . l e n g t h 1 \leq i < j \leq points.length 1i<jpoints.length。 ②

以①为条件可对②进行化简:

  • y i + y j + ∣ x i − x j ∣ y_i + y_j + |x_i - x_j| yi+yj+xixj—> ( y i − x i ) + ( y j + x j ) (y_i-x_i)+(y_j+x_j) (yixi)+(yj+xj)
  • ∣ x i − x j ∣ ≤ k |x_i - x_j| \leq k xixjk —> x j − x i ≤ k x_j - x_i \leq k xjxik

由此我们使用pair<T1, T2>(当pair为堆元素时,默认使用first元素为基准进行排序) 分别存放:

  • T1 = y i − x i y_i-x_i yixi

  • T2 = x j − x i x_j - x_i xjxi

正如我们所说,pair作为元素时以第一个元素为基准默认进行大根堆排序(降序)

因此我们每次进行 ∣ x i − x j ∣ ≤ k |x_i - x_j| \leq k xixjk (k值)的合理性判断+ y i + y j + ∣ x i − x j ∣ y_i + y_j + |x_i - x_j| yi+yj+xixj最大值动态更新即可


代码如下:

class Solution {
public:
    int findMaxValueOfEquation(vector<vector<int>>& points, int k) {
        priority_queue<pair<int, int>> q;
        q.push({points[0][1]-points[0][0], points[0][0]});
        // 首先先将第一个数传入,防止队列为空
        int ans = INT_MIN;   // 把答案假定为 整型最小值 方便后期比较
        for(int i = 1; i < points.size(); ++i) {
            while(!q.empty()&&points[i][0]-q.top().second > k) {  
            // 如果队列不为空 且合理性不通过,弹出当前与之比较的数据即可,直到合理为止
                q.pop();
            }
            if(!q.empty()) {  // 如果不为空动态更新答案即可
                ans = max(ans, q.top().first + points[i][0]+points[i][1]);
            }
            q.push({points[i][1]-points[i][0], points[i][0]});
        }        
        return ans;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值