双指针的引入和深入思考(持续更新中)

目录

1.引入双指针

2.使用场景

3.例题引入


1.引入双指针

当我们需要维护某个区间性质的或者是求满足某些性质的区间的长度时,对于一个区间是由左右端点的,我们有简单的枚举左右端点的O(n^2)的时间的做法,当时在大多数题目中是不可行的,由此我们考虑是否具有某些性质使用双指针优化时间复杂度。

双指针简单而言就是有两个指针一前一后的移动着,同时两个指针都是单调的,所以在时间复杂度上是可以做到o(n)

2.使用场景

依据题目意思我们可以发现要求满足某些性质的区间中,当我们移动右指针的时候,如果在满足性质的同时左指针只会单调的移动,同时维护区间性质的话就可以使用双指针

3.例题引入

1.直接考察双指针 : 最长连续不重复子序列

给定一个长度为 n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。

输入格式

第一行包含整数 n。

第二行包含 n个整数(均在 0∼100000 范围内),表示整数序列。

输出格式

共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。

数据范围

1≤n≤105

我们简单分析题意,是要求我们求满足某个性质的最长的区间,性质是不出现重复的数

我们可以发现对于判断数的重复可以使用一个桶来记录(本题数据范围小可使用数组)
接着分析问题可以得到一个基本结论,对于以i结尾的区间如果最长为[l_i,i],对于以i+1结尾的区间
[l_{i+1},i]那么l_i一定是小于等于l_{i+1}(因为如果小区间都不满足了大区间一定是不满足的)由此可以知道每个的最大区间一定是不重复叠加的 也就是说左端点是递增的

其中核心就是小区间不满足,大区间一定不满足由此可以得出指针一定是单调移动的


那么我们考虑用一个指针来维护左端点,然后用桶来判断即可(实际上是以i结尾的最长不重复连续区间的长度)所以是双指针来解决这个题目

void solve(){cin>>n;vector<int> cnt(N);vector<int> a(n+1);int ans = 0;for(int i=1,j=1;i<=n;i++){// 左指针为j ,右指针为icin>>a[i];cnt[a[i]]++;while(cnt[a[i]]>1){// 当前区间不满足性质cnt[a[j]]--;j++;// 开始移动左指针}ans = max(ans,i-j+1);}cout << ans << endl;return ;
}

由此可以得到我们的基本模板

for(int i=1,j=1;i<=n;i++){add(i)++; // add函数表示题目带来的性质while(!check()){ // check()函数表示题目的性质add(j)--;j++;}}

2.双指针和前缀和的运用 

对第一题进行变形变化为,求有满足恰好有三种不同数的区间的数量

此时我们发现如果是在上一题的基础上我们移动做指针是无法维护区间的的性质的,因为我们无法从一个满足要求的区间中得到这个区间俺的全部贡献所以直接双指针是不可行的,任意选择区间中的点得到的结果就是题目要求的<=要求的区间数量,对此我们对题目要求做一个简单的小处理

恰好等于 x == 小于等于x - 小于等于(x-1)这个时候我们对于这个题就可以用第一种方法解决

void solve() {int n;cin >> n;vector<int> a(n + 1);for (int i = 1; i <= n; i++) cin >> a[i];auto cal = [&](int x) -> ll {map<int, int> m;ll ans = 0;for (int i = 1, l = 1, c = 0; i <= n; i++) {if (++m[a[i]] == 1) c++;while (c > x) {if (--m[a[l++]] == 0) c--;}ans += i - l + 1;}return ans;};cout << cal(3) - cal(2) << endl;
}


 

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

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

相关文章

设计模式(六大原则)

目录 设计模式&#xff08;分类&#xff09; 设计模式&#xff08;六大原则&#xff09; 设计模式的六大原则是指导面向对象软件设计的基本准则&#xff0c;这些原则有助于设计出易于理解、灵活、可复用和可扩展的系统。 1. 单一职责原则 (Single Responsibility Prin…

ESP32 Arduino开发 MQTT

目录 ESP32 Arduino开发 MQTT 1. 安装程序库2. 编写相关程序 2.1. 引入头文件2.2. 定义MQTT相关参数2.3. 创建对象2.4. 连接网络2.5. 连接MQTT服务器2.6. MQTT回调函数3. 完整的

java中根据字段名称(数据库字段名称)获取当前对象对应字段的值

java实体类中多个字段要判断条件是否成立,需要一个一个写,可以通过数据库将对应字段存储,然后通过循环的方式去判断,减少代码冗余 public void AssaysAlO(){List<AssaysAlarm> list Lists.newArrayList();List<AssaysAlo> assaysAlos assaysAloMapper.selectAssa…

20240329-1-SVM面试题

SVM面试题 1. SVM直观解释 SVM&#xff0c;Support Vector Machine&#xff0c;它是一种二分类模型&#xff0c;其基本模型定义为特征空间上的间隔最大的线性分类器&#xff0c;间隔最大使它有别于感知机&#xff1b;其还包括核技巧&#xff0c;这使它成为实质上的非线性分类…

OpenCV从入门到精通实战(二)——文档OCR识别(tesseract)

导入环境 导入必要的库 numpy: 用于处理数值计算。 argparse: 用于处理命令行参数。 cv2: OpenCV库&#xff0c;用于图像处理。 import numpy as np import argparse import cv2设置命令行参数 ap argparse.ArgumentParser() ap.add_argument("-i", "--imag…

计算机中的小数表示

文章目录 前言整数表示的缺陷定点小数定点小数加法乘法运算 浮点数IEEE754浮点数标准移码阶码的移码表示 IEEE754中的特殊点两个0非规格化数字正常浮点数无穷大NaN 浮点数简单举例浮点数一些其余特性浮点数计算不符合结合律浮点数舍入规则浮点数与整数之间的相互转换 总结 前言…

“typecheck“:“tsc --noEmit“ 只进行类型检查,不输出结果

tsc --noEmit 是 TypeScript 编译器&#xff08;tsc&#xff09;的一个命令行参数。当你运行 tsc --noEmit 时&#xff0c;TypeScript 编译器会执行类型检查&#xff0c;但不会生成任何 JavaScript 输出文件。 具体来说&#xff1a; - tsc 是 TypeScript 编译器的命令。 - --…

记录一次k8s pod之间ip无法访问,问题排查与定位

记录一次k8s pod之间ip无法访问&#xff0c;问题排查与定位 问题展现现象 node之间通信正常 部分node上的pod无法通信 排查有问题node 使用启动网络测试工具 环境准备 docker 数据库mysql 使用有状态副本集合 --- apiVersion: apps/v1 kind: StatefulSet metadata:anno…

生成对抗网络GAN的扩展应用理解

注&#xff1a;本文仅个人学习理解&#xff0c;如需详细内容请看原论文&#xff01; 一、cycleGAN 1.整体架构&#xff1a; 将图片A通过生成器生成图片B&#xff0c;然后通过判别器判别图片B的真假&#xff1b;并且图片B通过另一个生成器生成A‘&#xff0c;让A和A’近似。 2…

C++ queue priority_queuestack 详解及模拟实现

1. stack的介绍和使用 1.1 stack的介绍 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容…

大模型日报2024-04-15

大模型日报 2024-04-15 大模型资讯 亚马逊再投资27.5亿美元加强与Anthropic合作推进生成式AI技术 摘要: 亚马逊宣布对人工智能公司Anthropic增加27.5亿美元的投资&#xff0c;旨在加深双方的合作关系。这笔投资将用于推动生成式人工智能技术&#xff0c;特别是大型语言模型的发…

JVM垃圾回收与算法

1. 如何确定垃圾 1.1 引用计数法 在 Java 中&#xff0c;引用和对象是有关联的。如果要操作对象则必须用引用进行。因此&#xff0c;很显然一个简单 的办法是通过引用计数来判断一个对象是否可以回收。简单说&#xff0c;即一个对象如果没有任何与之关 联的引用&#xff0c;即…

Leetcode 3107. Minimum Operations to Make Median of Array Equal to K

Leetcode 3107. Minimum Operations to Make Median of Array Equal to K 1. 解题思路2. 代码实现 题目链接&#xff1a;3107. Minimum Operations to Make Median of Array Equal to K 1. 解题思路 这一题思路上其实也比较直接&#xff0c;首先要使得中位数恰好为 k k k&am…

Python pyglet制作彩色圆圈“连连看”游戏

原文链接&#xff1a; Python 一步一步教你用pyglet制作“彩色方块连连看”游戏(续)-CSDN博客文章浏览阅读1.6k次&#xff0c;点赞75次&#xff0c;收藏55次。上期讲到相同的色块连接&#xff0c;链接见&#xff1a; Python 一步一步教你用pyglet制作“彩色方块连连看”游戏-…

Ai2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 Adobe illustrator&#xff0c;常被称为“AI”&#xff0c;是一种应用于出版、多媒体和在线图像的工业标准矢量插画的软件。作为一款非常好的矢量图形处理工具&#xff0c;该软件主要应用于印刷出版、海报书籍排版、专业插画、多…

Fiddler抓包工具之高级工具栏中的Inspectors的使用

高级工具栏中的Inspectors的使用 Inspectors 页签允许你用多种不同格式查看每个请求和响应的内容。JPG 格式使用 ImageView 就可以看到图片&#xff0c;HTML/JS/CSS 使用 TextView 可以看到响应的内容。Raw标签可以查看原始的符合http标准的请求和响应头。Cookies标签可以看到…

citus 之一 make 安装

os: centos 7.9.2009 citus: v12.1 OS 安装依赖包 sudo cd /etc/yum.repos.d sudo mkdir bak sudo mv *.repo ./baksudo wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/Centos-7.repo; sudo wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.re…

手机拍照技术

拍照技巧 说明: 本文将主要介绍摄影和手机常见技巧&#xff1b; 1. 摄影的基本知识 **说明&#xff1a;**关于摄影&#xff0c;手机和相机的原理都是相同的&#xff0c;不同的是相机在很多方面优于手机&#xff0c;但是专业的设备对于我们这种的非专业的人来说&#xff0c;刚…

乾坤微前端js沙箱机制

1 快照沙箱 modifyPropsMap对象存储子应用的属性&#xff1b; windowSnapshot对象存储微应用未加载时的window对象属性&#xff1b;进入微应用&#xff0c;利用windowSnapshot对象存储window对象的属性&#xff1b; 并将window对象的属性替换为modifyPropsMap对象的属性&#x…

Linux时间同步练习

题目如下&#xff1a; 一.配置server主机要求如下&#xff1a; 1.server主机的主机名称为 ntp_server.example.com 2.server主机的IP为&#xff1a; 172.25.254.100 3.server主机的时间为1984-11-11 11&#xff1a;11&#xff1a;11 4.配置server主机的时间同步服务要求可以被所…