Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • 数组

  • 链表

  • 字符串

  • 二叉树

  • 动态规划

  • 深搜回溯

  • 数学贪心

  • 堆栈队列

    • 394.字符串解码
    • 32. 最长有效括号
    • 739. 每日温度
    • 1130. 叶值的最小代价生成树
    • 84. 柱状图中最大的矩形
    • 42.接雨水
    • 85. 最大矩形
    • 239.滑动窗口最大值
    • 6891. 机器人碰撞
    • 445. 两数相加 II
    • 2762. 不间断子数组
    • 6919. 使数组中的所有元素都等于零
    • 862. 和至少为 K 的最短子数组
    • 1499. 满足不等式的最大值
      • 1.单调队列
    • 2856. 删除数对后的最小数组长度
    • 901. 股票价格跨度
    • 2034. 股票价格波动
    • 1488. 避免洪水泛滥
    • 2940. 找到 Alice 和 Bob 可以相遇的建筑
    • 2454. 下一个更大元素 IV
  • 前缀和

  • 算法设计

  • 位运算

  • WA

  • 算法
  • 堆栈队列
phan
2023-07-21
目录

1499. 满足不等式的最大值

# 1499. 满足不等式的最大值 (opens new window)

# 1.单调队列

分析:将不等式变形为 yi+yj+|xi-xj| = (xj+yj)+(yi-xi) ,其中j>i,从而将问题转化为从小于j横坐标的点中,找到y坐标值减去x坐标值的最大值坐标点 。

使用单调队列实现,队列存储二元组【xi,yi-xi】,队列维护时需要保证yi-xi从队首到队尾是递减的:

  • 计算最大不等式:对于当前坐标i来说,如果队首最大值与当前坐标不满足k间距约束,那么队首元素出队列。直到保证此时队首元素一定能够与当前坐标i构成一个最大不等式。
  • 当前元素入队:考虑当前元素i入队后,队列中哪些元素在后续的搜索是无用的?需要将队列中所有y-x差小于当前坐标结果的元素j移出队列。因为在后续搜索的过程当中,相比于坐标 j ,当前坐标i一定会是更优解。

根据问题求解的需要确定队列元素维护时单调的属性。本题中既然要求j节点之前最大的yi-xi,那么队列就维护y-x的单调性。因为遍历时是从左向右遍历,天然满足搜索时索引单调。虽然队列中不能保证x坐标是单调的,但是当前坐标j合并的坐标只需要保证①它的y-x是最大的②满足k约束这两个条件即可。

int res=Integer.MIN_VALUE;
        Deque<int[]>  queue=new LinkedList<>();
        for(int i=0;i<points.length;i++){
            int sum=points[i][0]+points[i][1];
            int sub=points[i][1]-points[i][0];
            //先移除所有x坐标不满足条件的坐标
            while(!queue.isEmpty()&&points[i][0]-queue.peekFirst()[0]>k) queue.pollFirst();
            while(!queue.isEmpty()&&sub>=queue.peekLast()[1]){
                res=Math.max(res,sum+queue.pollLast()[1]);
            }
            if(!queue.isEmpty())res=Math.max(res,sum+queue.peekFirst()[1]);
            queue.offerLast(new int[]{points[i][0],sub});

        }
        return res;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
编辑 (opens new window)
#Leetcode#堆栈队列
上次更新: 2023/12/15, 15:49:57
862. 和至少为 K 的最短子数组
2856. 删除数对后的最小数组长度

← 862. 和至少为 K 的最短子数组 2856. 删除数对后的最小数组长度→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式