题目内容
给你一个数组 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 的点。
题目分析
yi + yj + |xi - xj|
= yi + yj - xi + xj
= (- xi +yi) + (xj +yj )
一层循环 O(n)
算法思路:
遍历点集合,使得每个点作为(xj,yj).然后只要求出满足xj-xi<=k的最大的(y-x)即可
所以我们需要一个数据结构来存储满足xj-xi<=k的坐标的y-x
这里选择了双端队列,队列内元素为一个坐标的(y-x,x)。
1.x用于和(xj)比较,实现满足xj-xi<=k的筛选
2.y-x 在计算最大值时需要
3.每次遍历完一个坐标后,对队列进行更新,从队尾开始,将y-x必当前值小的都弹出,保证在队列中,元素按y-x的值的大小降序排列
# 一层循环 O(n)
# 算法思路:
# 遍历点集合,使得每个点作为(xj,yj).然后只要求出满足xj-xi<=k的最大的(y-x)即可
# 所以我们需要一个数据结构来存储满足xj-xi<=k的坐标的y-x
# 这里选择了双端队列,队列内元素为一个坐标的(y-x,x)。
# 1.x用于和(xj)比较,实现满足xj-xi<=k的筛选
# 2.y-x 在计算最大值时需要
# 3.每次遍历完一个坐标后,对队列进行更新,从队尾开始,将y-x必当前值小的都弹出,保证在队列中,元素按y-x的值的大小降序排列
class Solution:
def findMaxValueOfEquation(self, points: [[]], k: int) -> int:
import collections
res = -float("inf")
q = collections.deque()
for x, y in points:
#xj-xi<=k
while q and x - q[0][0] > k: # 若队首存在 且 xj - xi >k
q.popleft() #弹出队首 xi
# 返回值更新
if q: # 若队列非空
res = max(res, x + y + q[0][1]) #
# 队列内的元素更新
while q and y - x >= q[-1][1]:
q.pop()
q.append([x,y - x])
return res
枚举法
# 两层循环 O(n**2)
class Solution:
def findMaxValueOfEquation(self, points: [[]], k: int) -> int:
res = -float("inf")
for j in range(len(points)):
t = points[j][0]+points[j][1]
for i in range(j):
c = points[j][0]-points[i][0]
if c<=k and c>=0:
#print(points[i][0],points[j][0])
res = max(res,0-points[i][0]+points[i][1]+t)
#print(res)
return res