单调性的应用

news2024/11/15 21:28:15

1单调性

  • 应用场景:常应用于双指针的进一步优化问题中
  • 含义:针对指针 i 1 > i i1>i i1>i一定有 j 1 > = j j1>=j j1>=j或者 j 1 < = j j1<=j j1<=j
  • 这样我们就可以利用该性质对算法进行进一步优化,避免一些不必要的遍历

2. leetcode题目举例

在这里插入图片描述

思路分析

假设删除的是 a r r [ i + 1 ] ∼ a r r [ j − 1 ] arr[i+1]∼arr[j−1] arr[i+1]arr[j1]则需要满足以下条件

  • a r r [ 0 ] ∼ a r r [ i ] arr[0]∼arr[i] arr[0]arr[i]非递减。
  • a r r [ j ] ∼ a r r [ n − 1 ] arr[j]∼arr[n−1] arr[j]arr[n1]非递减
  • a r r [ i ] ≤ a r r [ j ] arr[i]≤arr[j] arr[i]arr[j]
    如果我们对所有满足条件的 i i i j j j进行一次二次遍历,则时间复杂度为O(lr)其中 l 为左半部分长度,r为右半部分长度
  • 我们尝试去寻找 i i i j j j的规律
  • 对于 左半部分的 x ( 左半部分非递减段 ) x(左半部分非递减段) x(左半部分非递减段) 我们假设 最小的 符合条件的 j j j y y y
  • 如果有 x 1 > x x1>x x1>x,则至少有 y 1 > = y y1>=y y1>=y优化的重要性质

证明(反证法)

  • 如果 y 1 < y y1<y y1<y
    则又因为
  • x 1 > x x1>x x1>x
  • a r r [ y 1 ] > = a r r [ x 1 ] arr[y1]>=arr[x1] arr[y1]>=arr[x1],
  • a r r [ x 1 ] > = a r r [ x ] arr[x1]>=arr[x] arr[x1]>=arr[x]
    所以 a r r [ y 1 ] > = a r r [ x ] arr[y1]>=arr[x] arr[y1]>=arr[x] 且, x , y 1 , y x,y1, y x,y1y 位于左右部分的非递减段,则 y 1 y1 y1 x x x 对应的最小答案,与先前定义不符

举例说明

我们以题中示例举例 (这里我们直接时候对应的值,括号中为下标,方便理解)

  • [1,2,3,10,4,2,3,5]
  • 1(0) 对应的最小的 j 为 为2(5)
  • 我们遍历 2(1)对应的 j 最小为 2(5) ,不可能在2(5)的前面寻找
  • 这就是我们所证明的性质的意思
class Solution {
    //单调性
    //对于任意的 i1>i
    //其对应的j 一定有 j1>=j
    public int findLengthOfShortestSubarray(int[] nums) {
        int n=nums.length;
        int j=n-1;
        //寻找最靠左的j
        while(j>=1 && nums[j]>=nums[j-1])j--;
        //J 为0说明本身就是非递减,无需删除
        if(j==0)return 0;
        //最长的删除长度,前半部分全部删除
        int res=j;
        //枚举 i
        for(int i=0;i<n;){
        //寻找最小的符合条件的 j
            while(j<n && nums[i]>nums[j])j++;
            res=Math.min(res,j-i-1);
            //如果 i 还在非递减段则枚举下一个,否则,停止枚举
            if(i!=n-1 &&nums[i+1]>=nums[i])i++;
            else break;
        }
        return res;

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1411571.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于卡尔曼滤波的平面轨迹优化

文章目录 概要卡尔曼滤波代码主函数代码CMakeLists.txt概要 在进行目标跟踪时,算法实时测量得到的目标平面位置,是具有误差的,连续观测,所形成的轨迹如下图所示,需要对其进行噪声滤除。这篇博客将使用卡尔曼滤波,对轨迹进行优化。 优化的结果为黄色线。 卡尔曼滤波代码…

微信小程序元素/文字在横向和纵向实现居中对齐、两端对齐、左右对齐、上下对齐

元素对齐往往是新学者的一大困惑点&#xff0c;在此总结常用的各种元素和文字对齐方式以供参考&#xff1a; 初始显示 .wxml <view style"width: 100%;height: 500rpx; background-color: lightgray;"><view style"width: 200rpx;height:100rpx;bac…

STM32CubeMX教程29 USB_HOST - 使用FatFs文件系统读写U盘

目录 1、准备材料 2、实验目标 3、USB概述 3.1、USB协议 3.2、USB设备 3.3、USB接口 3.4、硬件原理 4、实验流程 4.0、前提知识 4.1、CubeMX相关配置 4.1.0、工程基本配置 4.1.1、时钟树配置 4.1.2、外设参数配置 4.1.3、外设中断配置 4.2、生成代码 4.2.0、配…

C++ day2 类 访问权限

1> 思维导图 2> 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void s…

数据权限方案设计(后端)

有些BO模型放在bo包下用来装一些SQL语句查询返回&#xff0c;用于在Service层中进行处理业务逻辑,不会出现在Controller接口层的包装中。在持久层的基础组件中&#xff0c;我司业务种用的是Mysql5.7版本。在前后端开发使用的是分离技术&#xff0c;即前端使用流行的VUEElement-…

RISC-V常用汇编指令

RISC-V寄存器表&#xff1a; RISC-V和常用的x86汇编语言存在许多的不同之处&#xff0c;下面将列出其中部分指令作用&#xff1a; 指令语法描述addiaddi rd,rs1,imm将寄存器rs1的值与立即数imm相加并存入寄存器rdldld t0, 0(t1)将t1的值加上0,将这个值作为地址&#xff0c;取…

6家券商综合评级上升,12月券商App终端业务体验评测报告发布

随着移动金融服务的盛行&#xff0c;手机 App 炒股成为广大股民普遍的选择。股市行情变幻莫测&#xff0c;行情推送速度会影响到投资者的交易决策&#xff0c;委托下单与撤单等关键操作环节的响应性能又会极大影响投资者的收益。由此&#xff0c;行情数据的推送实时性和交易的快…

小程序系列--14.小程序分包

一、基础概念 1. 什么是分包 分包指的是把一个完整的小程序项目&#xff0c;按照需求划分为不同的子包&#xff0c;在构建时打包成不同的分包&#xff0c;用户在使用时按需进行加载。 2. 分包的好处 3. 分包前项目的构成 4. 分包后项目的构成 5. 分包的加载规则 6. 分包的…

vue3预览pdf文件的几种方法

vue3预览pdf集中方法 方法一&#xff1a; iframe&#xff1a;这种方法显示有点丑 <iframesrc"E:\\1.pdf"frameborder"0"style"width: 80%; height: 100vh; margin: auto; display: block"></iframe>方法二&#xff1a; 展示效果&…

Objective-C方法的声明实现及调用

1.无参数的方法 1)声明 a.位置&#xff1a;在interface括弧的外面 b.语法&#xff1a; - (返回值类型)方法名称; interface Person : NSObject -(void) run; end 2)实现 a.位置&#xff1a;在implementation中实现 b.语法&#xff1a;加大括弧将方法实现的代码写在大括孤之中 …

浅出深入-机器学习

文章目录 一、K近邻算法1.1 先画一个散列图1.2 使用K最近算法建模拟合数据1.3 进行预测1.4 K最近邻算法处理多元分类问题1.5 K最近邻算法用于回归分析1.6 K最近邻算法项目实战-酒的分类1.6.1 对数据进行分析1.6.2 生成训练数据集和测试数据集1.6.3 使用K最近邻算法对数据进行建…

抽象工厂模式-C#实现

该实例基于WPF实现&#xff0c;直接上代码&#xff0c;下面为三层架构的代码。 一 Model using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 设计模式练习.Model.抽象工厂模式 {public abstrac…

学习笔记之 机器学习之预测雾霾

文章目录 Encoder-DecoderSeq2Seq (序列到序列&#xff09; Encoder-Decoder 基础的Encoder-Decoder是存在很多弊端的&#xff0c;最大的问题就是信息丢失。Encoder将输入编码为固定大小的向量的过程实际上是一个“信息有损的压缩过程”&#xff0c;如果信息量越大&#xff0c;…

Rollup:打包 TypeScript - React 组件库

调用浏览器摄像头拍照组件 1、前提1、安装依赖2、添加 rollup.config.js 配置3、修改 package.json3.1 添加打包命令3.2 添加组件入口3.3 添加组件声明入口3.4 浏览器支持 1、前提 1.1 通过 create-react-app take-photo --template 创建前端应用 1.2 添加组件 TakePhoto (拍照…

华为三层交换机之基本操作

Telnet简介 Telnet是一个应用层协议,可以在Internet上或局域网上使用。它提供了基于文本的远程终端接口&#xff0c;允许用户在本地计算机上登录到远程计算机&#xff0c;然后像在本地计算机上一样使用远程计算机的资源。Telnet客户端和服务器之间的通信是通过Telnet协议进行的…

<蓝桥杯软件赛>零基础备赛20周--第17周--并查集

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

JavaSE基础学习

一、编程入门 二、Java语言概述 三、Java基本语法 四、程序流程控制 五、数组 六、面向对象(上) 数组工具类的封装: 七、面向对象(中) 八、面向对象(下) 九、异常处理 十、多线程 十一、常用类 十二、枚举类与注解 十三、集合 十四、泛型 十五、IO流 十六、网络编程 十七、反射…

【论文阅读】Grasp-Anything: Large-scale Grasp Dataset from Foundation Models

文章目录 Grasp-Anything: Large-scale Grasp Dataset from Foundation Models针对痛点和贡献摘要和结论引言相关工作Grasp-Anything 数据集实验 - 零镜头抓取检测实验 - 机器人评估总结 Grasp-Anything: Large-scale Grasp Dataset from Foundation Models Project page&…

【重点】【DP】123.买卖股票的最佳时机III

题目 法1&#xff1a;单次遍历&#xff0c;Best! class Solution {public int maxProfit(int[] prices) {int f1 -prices[0], f2 0, f3 -prices[0], f4 0;for (int i 1; i < prices.length; i) {f1 Math.max(f1, -prices[i]);f2 Math.max(f2, f1 prices[i]);f3 Ma…

Cesium中实现流体模拟

流体模拟 流体模拟是指通过数学模型和计算机算法来模拟流体行为的过程。它可以用来研究和预测各种液体和气体的运动、相互作用和变形。 流体模拟有多种方法&#xff0c;下面列举了几种常见的方法&#xff1a; 网格方法&#xff1a;网格方法是最常用的流体模拟方法之一。它将模…