满足不等式的最大值(困难)

题目内容

给你一个数组 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值