双指针与滑动窗口

双指针

相向双指针

两数之和
在这里插入图片描述
题意是找到不同两个数使得它们相加和为target,数组有序
利用数组有序的性质,判断指针前后的区间的性质
例如:2 3 4 6 8, target 9
2 + 8 = 10 > 9, 因为非递减序列,2之后的每个数都会大等于2,所以 2之后的每个数和8相加都会 > 9,eg 3+8,4+8,6+8…。
在这种情况下,已经不可能有解。造成无解的原因是因为 8 这个数 太大, 因此将r指针左移去除8。

2 + 6 = 8 < 9, 因为非递减序列,所以 6之前的每个数相加都会 < 9,eg 2+4,2+3,…
在这种情况下,已经不可能有解。造成无解的原因是因为2 这个数 太小, 因此将l指针右移去除2

class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {int l = 0, r = numbers.size() - 1;// 2 3 4 6 8, target 9// 2 + 8 = 10 > 9, 因为非递减序列,所以 2之后的每个数相加都会>9,eg 3+8,4+8,6+8..// 所以我们直接删除 8,r--// 2 + 6 = 8 < 9, 因为非递减序列,所以 6之前的每个数相加都会<9,eg 2+4,2+3,..// 所以我们直接删除 2,l++while(l < r){if(numbers[l] + numbers[r] > target) r --;else if(numbers[l] + numbers[r] < target) ++ l;else break;}return {l + 1, r + 1};}
};

三数之和
在这里插入图片描述
同两数之和, 增加一个遍历第一个数即可

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int n = nums.size();ranges::sort(nums);vector <vector<int>> res;for(int i = 0;i < n - 2;i ++){int x = nums[i];if(i > 0 && x == nums[i - 1]) continue;// 当前三个小的数相加已经大于0, 后续的数只会比当前的数更大,因此一定大于0,可以直接结束if(x + nums[i + 1] + nums[i + 2] > 0) break; // 当前的数x 加上最大的两个数仍然比0小,因此在和(i+1, n-1)内的数相加也一定小于0,可以跳过。 后续遍历到更大的x的时候仍有机会有解if(x + nums[n - 1] + nums[n - 2] < 0) continue;int j = i + 1, k = n - 1;while(j < k){int s = x + nums[j] + nums[k];if(s > 0) -- k;else if(s < 0) ++ j;else{res.push_back({x, nums[j], nums[k]});j ++;while(j < k && nums[j - 1] == nums[j]) ++ j;-- k;while(j < k && nums[k + 1] == nums[k]) -- k;}}}return res;}
};

一些变形题目:
lc2824. 统计和小于目标的下标对数目 https://leetcode.cn/problems/count-pairs-whose-sum-is-less-than-target/
lc16. 最接近的三数之和 https://leetcode.cn/problems/3sum-closest/
lc18. 四数之和 https://leetcode.cn/problems/4sum/

lc611. 有效三角形的个数 https://leetcode.cn/problems/valid-triangle-number/

其中, 有效的三角形个数是对最长边(最大数开始循环),而不是之前的最小数。
因为如果遍历最小数,会出现如下情况:
a+b太小了,a是固定的,所以j要往大的方向走,即j++
c太大了,k往小的方向走,即k-- 这一个分支里不可能同时包含这两种处理方式,因为j++和k–是相向而行的,这必定会少得到一些情况。其次,就算只用其中一种处理办法,也会漏掉。

根本原因是a + b == c在这种情况下有歧义,因为我们固定的是最小边,而最小边在这个式子里是a,当出现==情况时,既有可能是b,也有可能是c造成的,这就好像一个等式两边都有自变量3x=4y,谁对这个等式都有影响。 这样会导致我们对指针的移动情况判断不是唯一的,到底是增大b还是减小c ?因此,这类问题,也就是通过判定值来对双指针指向的值构成的条件进行指针遍历的问题,并且要保证根据判定值的大小关系使得指针的变化必须是唯一的。

固定最大边,就能保证这个等式的含义一定是:a+b的值太小了,得往值更大的方向走。这样就能在遍历c的时,完整地找出所有符合条件的a和b。 所以在使用相向双指针,思考要固定哪边时,就想想大于小于或等于这三种表达式有没有歧义。

class Solution {
public:int triangleNumber(vector<int>& nums) {// a + b > cranges::sort(nums);int n = nums.size();int res = 0;for(int k = n - 1; k > 1;k --){int c = nums[k];int l = 0, r = k - 1;while(l < r){if(nums[l] + nums[r] > c){ // 当前下标l加上 l之后的值都满足条件,计算答案res += r - l;-- r;}else{++ l; // a值太小或者说(a + b)值太小,增加}}}return res;}
};

接雨水 (双指针 以及 前后缀数组

前后缀数组:对于数组的某个位置 I,通过预处理的方式,利用数组存储信息,可以 O(1) 得到 I 之前/之后的数最大值/最小值/区间和/单调性等信息。最大/小值是取max/min;区间和就是前缀和;单调性是指O(1)判断某个区间是否为单调区间,计算某个区间的递增次数和区间长度进行对比,若两者相等则这当前区间为单调区间,否则不是。

滑动窗口 (同向双指针)

要求一个连续的子数组 (若答案和顺序无关也可以排序后考虑), 其次是单调性 ,保证操作对于结果是单调的,递增或递减

滑动窗口的核心要点:

1.维护一个有条件的滑动窗口;
2.右端点右移,导致窗口扩大,是不满足条件的原因;
3.左端点右移目的是为了缩小窗口,重新满足条件;

这个条件一般就是题目变化的地方,例如数字或者字符出现次数、乘积、区间和。
可以用许多种数据结构 or 变量来维护这个条件,用O(1)的时间判断窗口内是否符合条件。
对于条件可以进行些处理,如果正向操作太难,考虑反着求解,正难则反

答案可以是最短/最长/方案数等等,对于方案数,最终符合条件的不一定只是窗口内的,也要考虑窗口外的。

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

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

相关文章

unity开发之shader 管道介质流动特效

效果 shader graph 如果出现下面的效果&#xff0c;那是因为你模型的问题&#xff0c;建模做贴图的时候没有设置好UV映射&#xff0c;只需重新设置下映射即可

python +tkinter绘制彩虹和云朵

python tkinter绘制彩虹和云朵 彩虹&#xff0c;简称虹&#xff0c;是气象中的一种光学现象&#xff0c;当太阳光照射到半空中的水滴&#xff0c;光线被折射及反射&#xff0c;在天空上形成拱形的七彩光谱&#xff0c;由外圈至内圈呈红、橙、黄、绿、蓝、靛、紫七种颜色。事实…

stable diffusion安装mov2mov

第一步&#xff1a; 下载mov2mov&#xff0c;地址&#xff1a;https://gitcode.com/gh_mirrors/sd/sd-webui-mov2mov 下载包到web-ui的sd-webui-aki-v4.10\extensions文件夹面解压 第二步&#xff1a;在文件夹中调出cmd窗口&#xff0c;执行下列命令&#xff0c; git restore…

SpringSpringBoot常用注解总结

目录 1. SpringBootApplication 2. Spring Bean 相关 2.1. Autowired 2.2. Component,Repository,Service, Controller 2.3. RestController 2.4. Scope 2.5. Configuration 3. 处理常见的 HTTP 请求类型 3.1. GET 请求 3.2. POST 请求 3.3. PUT 请求 3.4. DELETE 请…

STM32 软件I2C读写

单片机学习&#xff01; 目录 前言 一、软件I2C读写代码框架 二、I2C初始化 三、六个时序基本单元 3.1 引脚操作的封装和改名 3.2 起始条件执行逻辑 3.3 终止条件执行逻辑 3.4 发送一个字节 3.5 接收一个字节 3.5 发送应答&接收应答 3.5.1 发送应答 3.5.2 接…

七种改进爬山算法的方法

一、爬山算法 爬山算法(Hill Climbing Algorithm)是一种启发式的基于局部最优解的搜索算法,用于在给定的搜索空间中寻找全局最优解或足够好的解。它属于局部搜索算法,通常用于解决优化问题,包括连续和离散问题。 爬山算法模拟了爬山的过程,从某个随机起始点开始,不断向更…

MYSQL--------MYSQL中的运算符

以下是 MySQL 中各种运算符的介绍及代码示例&#xff1a; 算术运算符 算术运算符用于执行基本的数学运算&#xff0c;包括加、减、乘、除、取模&#xff08;取余&#xff09;。 -- 创建一个名为 operator_demo 的表 CREATE TABLE operator_demo (a INT,b INT );-- 插入示例数…

MySQL图形化界面工具--DataGrip

之前介绍了在命令行进行操作&#xff0c;但是不够直观&#xff0c;本次介绍图形化界面工具–DataGrip。 安装DataGrip 官网链接&#xff1a;官网下载链接 常规的软件安装流程。 参考链接&#xff1a;DataGrip安装 使用DataGrip 添加数据源&#xff1a; 第一次使用最下面会…

【虚拟机】VMware 16图文安装和配置 AlmaLinux OS 9.5 教程

准备工作 下载AlmaLinux ISO文件&#xff1a;从AlmaLinux官方网站&#xff08;https://almalinux.org/&#xff09;下载最新版本的ISO文件。 安装VMware Workstation&#xff1a;确保您的计算机上已安装VMware Workstation。&#xff08;注&#xff1a;我这边使用的是VMware16…

中国联通首次推出一套量化大模型的新标准

新基准的诞生 中国联通的研究团队近日公布了一套创新性的量化标准&#xff0c;主要针对大型语言模型的能力评估。这一基准的灵感来源于动物智能演化的规律&#xff0c;为用户在选择语言模型时提供了科学依据。现代社会中&#xff0c;各种语言模型如雨后春笋般涌现&#xff0c;…

aardio —— 虚表 —— 使用ownerDrawCustom列类型制作喜马拉雅播放器列表

不会自绘也能做漂亮列表&#xff0c;你相信吗&#xff1f; 看看这个例子&#xff0c;虚表_vlistEx_ColType_OwnerDrawCustom列类型&#xff0c;移植自godking.customPlus&#xff0c;简单好用&#xff0c;做漂亮列表的大杀器&#xff0c;玩aardio必备利器&#xff01; 请更新…

网安数学基础期末复习

目录 整除同余同余方程群和环 整除 a的显然因数/平凡因数1&#xff0c;a整除的传递性和组合性 若 a ∣ b , b ∣ a a|b,b|a a∣b,b∣a 则 a b a\pm b ab欧几里得带余除法 公因数和最大公因数在整除里的定义&#xff0c;最大公因数为1则两数互质&#xff0c;注意公因数有正…

【论文阅读笔记】SCI算法与代码 | 低照度图像增强 | 2022.4.21

目录 一 SCI 1 SCI网络结构 核心代码&#xff08;model.py&#xff09; 2 SCI损失函数 核心代码&#xff08;loss.py&#xff09; 3 实验 二 SCI效果 1 下载代码 2 运行 一 SCI &#x1f49c;论文题目&#xff1a;Toward Fast, Flexible, and Robust Low-Light Image …

AcWing练习题:平均数2

读取三个浮点数 A&#xff0c;B 和 C 的值&#xff0c;对应于三个学生的成绩。 请你计算学生的平均分&#xff0c;其中 A 的成绩的权重为 2&#xff0c;B 的成绩的权重为 3&#xff0c;C 的成绩的权值为 5。 成绩的取值范围在 0 到 10 之间&#xff0c;且均保留一位小数。 输…

aardio —— 改变按钮文本颜色

import win.ui; /*DSG{{*/ var winform win.form(text"改变按钮颜色示例";right279;bottom239;composited1) winform.add( button{cls"button";text"点这里1";left16;top104;right261;bottom159;fontLOGFONT(h-14);z1}; button2{cls"butto…

Scratch教学作品 | 白水急流——急流勇进,挑战反应极限! ‍♂️

今天为大家推荐一款刺激又好玩的Scratch冒险作品——《白水急流》&#xff01;由AgentFransidium制作&#xff0c;这款作品将带你体验惊险的急流救援任务&#xff0c;帮助那位“睡着的疯狂人”安全穿越湍急水域&#xff01;想要挑战自己的反应极限&#xff1f;快来试试吧&#…

Android测试ABD环境及语句

1、什么是adb ADB 全称为 Android Debug Bridge&#xff0c;起到调试桥的作用&#xff0c;是一个客户端-服务器端程序。其中客户端是用来操作的电脑&#xff0c;服务端是 Android 设备。 ADB 也是 Android SDK 中的一个工具&#xff0c;可以直接操作管理 Android 模拟器或者真…

库伦值自动化功耗测试工具

1. 功能介绍 PlatformPower工具可以自动化测试不同场景的功耗电流&#xff0c;并可导出为excel文件便于测试结果分析查看。测试同时便于后续根据需求拓展其他自动化测试用例。 主要原理&#xff1a;基于文件节点 coulomb_count 实现&#xff0c;计算公式&#xff1a;电流&…

creating-custom-commands-in-flask

在烧瓶中创建自定义命令 原文:https://www . geesforgeks . org/creating-custom-commands-in-flask/ 本文围绕如何在 flask 中创建自定义命令展开。每次使用烧瓶运行运行烧瓶时&#xff0c;运行实际上是一个命令&#xff0c;在烧瓶配置文件中启动一个名为运行的函数。同样&…

机器学习基础-机器学习的常用学习方法

半监督学习的概念 少量有标签样本和大量有标签样本进行学习&#xff1b;这种方法旨在利用未标注数据中的结构信息来提高模型性能&#xff0c;尤其是在标注数据获取成本高昂或困难的情况下。 规则学习的概念 基本概念 机器学习里的规则 若......则...... 解释&#xff1a;如果…