给你一个数组 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?+∣xi??xj?∣ 的 最大值,其中
∣
x
i
?
x
j
∣
<
=
k
|xi - xj| <= k
∣xi?xj∣<=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
∣xi??xj?∣<=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?+∣xi??xj?∣ 的 最大值,其中
∣
x
i
?
x
j
∣
≤
k
|x_i - x_j| \leq k
∣xi??xj?∣≤k 且
1
≤
i
<
j
≤
p
o
i
n
t
s
.
l
e
n
g
t
h
1 \leq i < j \leq points.length
1≤i<j≤points.length。 ②
以①为条件可对②进行化简:
-
y
i
+
y
j
+
∣
x
i
?
x
j
∣
y_i + y_j + |x_i - x_j|
yi?+yj?+∣xi??xj?∣—>
(
y
i
?
x
i
)
+
(
y
j
+
x
j
)
(y_i-x_i)+(y_j+x_j)
(yi??xi?)+(yj?+xj?)
-
∣
x
i
?
x
j
∣
≤
k
|x_i - x_j| \leq k
∣xi??xj?∣≤k —>
x
j
?
x
i
≤
k
x_j - x_i \leq k
xj??xi?≤k
由此我们使用pair<T1, T2>(当pair为堆元素时,默认使用first元素为基准进行排序) 分别存放:
正如我们所说,pair作为元素时以第一个元素为基准默认进行大根堆排序(降序)
因此我们每次进行
∣
x
i
?
x
j
∣
≤
k
|x_i - x_j| \leq k
∣xi??xj?∣≤k (k值)的合理性判断+
y
i
+
y
j
+
∣
x
i
?
x
j
∣
y_i + y_j + |x_i - x_j|
yi?+yj?+∣xi??xj?∣最大值动态更新即可
代码如下:
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;
}
};
|