当前位置: 首页 > news >正文

codetop标签双指针题目大全解析(三),双指针刷穿地心!!!!!

复习比学习更重要,更需要投入时间,更需要花费精力

  • 1.字符串的排列
  • 2.找出字符串中第一个匹配的下标
  • 3.最大连续1的个数II
  • 4.数组中的山脉
  • 5.移除元素
  • 6.两个数组的交集II
  • 7.有序数组的平方
  • 8.删除有序数组中的重复项II
  • 9.寻找重复数
  • 10.水果成篮

1.字符串的排列

在滑动窗口总结文章里面讲解过了

二刷debug:首先,缩小窗口的条件是r-l >s1.size()。然后,必须用need.count( c )而不是need[c] >= 1。count( c ) 仅仅检查键 c 是否存在于 unordered_map 中,与键对应的值无关!而need[c]>=1是必须need中有其键并且数量大于等于1

class Solution {
public:bool checkInclusion(string s1, string s2) {unordered_map<char, int> window, need;for(char c : s1) need[c] ++;int left = 0, right = 0;int valid = 0;while(right < s2.size()){char c = s2[right];right++;if(need.count(c)){window[c]++;if(need[c] == window[c]) valid++;}while(right - left > s1.size()){char d = s2[left];left ++;if(need.count(d)){if(need[d] == window[d]) valid--;window[d]--;}}if(need.size() == valid && right - left == s1.size()){return true;}}return false;}
};

2.找出字符串中第一个匹配的下标

在这里插入图片描述
拿到手的第一想法就是,滑动窗口,输出left
但是这个要求顺序完全一样,不能是排列或者组合
查了一下KMP是专门弄这种的,学习新算法了在这里插入图片描述(我只是来做双指针的…)这篇文章是个纯刷题记录,不贴详细讲解,最多记录大致思路,需要讲解去秒杀直接部分->传送门
二刷debug:写出来了,几乎是靠背的,注意ne初始化

class Solution {
public:int strStr(string haystack, string needle) {int n = haystack.size();int m = needle.size();vector<int> ne(m, -1);// ne数组必须初始化为-1而不是0,只有-1才代表没有相同的前后缀// 建next数组for(int i = 1, j = -1; i < m; i ++){while(j != -1 && needle[i] != needle[j + 1]) j = ne[j];if(needle[i] == needle[j + 1]) j ++;ne[i] = j;}// 匹配for(int i = 0, j = -1; i < n; i ++){while(j != -1 && haystack[i] != needle[j + 1]) j = ne[j];if(haystack[i] == needle[j + 1]) j ++;if(j == m - 1){return i - m + 1;}}return -1;}
};

3.最大连续1的个数II

不是,家人们,滑动窗口为什么都划到双指针标签下了啊
题:
给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。
eg:
输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2
输出:6
在秒杀系列的滑动窗口秒杀文章里面写过
用滑动窗口做题需要先明白3个问题

  1. 什么时候扩大窗口?更改什么数据?
  2. 什么时候缩小窗口?更改什么数据?
  3. 什么时候得到答案?

针对123的答案:

  1. 当可替换次数k>=0的时候扩大窗口,更改窗口里面1的个数,让窗口里面都是1,等于0的时候也扩,万一窗口外面不需要改呢。
  2. 当可替换次数k<0的时候缩小窗口,可替换次数++,以便继续扩大
  3. k>=0的时候,窗口内部都是1,len更新
class Solution {
public:int longestOnes(vector<int>& nums, int k) {int left = 0, right = 0;int windowOneCount = 0;int res = 0;while(right < nums.size()){//right是0也++,是1就windowOneCount++,自身也++if(nums[right] == 1){windowOneCount ++;}right ++;//窗口里面0的个数超过了k,就开始缩小窗口while(right - left - windowOneCount > k){if(nums[left] == 1) windowOneCount --;left ++;}res = max(res, right - left);}return res;}
};

4.数组中的山脉

在这里插入图片描述
先找到可能得山顶,再双指针两边扩展,记录res
留意l,r,i的边界
二刷debug:注意双指针两边扩展的手法,还有边界问题,如果是只能到倒数第二个元素的话,i<.size()-1即可

class Solution {
public:int longestMountain(vector<int>& arr) {int l = 0, r = 0, res = 0;for(int i = 1; i < arr.size() - 1; i ++){if(arr[i] > arr[i - 1] && arr[i] > arr[i + 1]){l = i - 1;r = i + 1;while(l > 0 && arr[l] > arr[l - 1]) l --;while(r < arr.size() - 1 && arr[r] > arr[r + 1]) r ++;res = max(res, r - l + 1);}}return res;}
};

5.移除元素

移除val,返回新数组的长度
双指针里也有这题,秒啦

class Solution {public int removeElement(int[] nums, int val) {int i = 0;for (int n : nums)if (n != val) {nums[i] = n;i++;}return i;}
}

6.两个数组的交集II

给nums1和nums2,以数组的形式返回两数组里都存在的数,并且这个数的次数要等于两个数组中这个数出现次数更少的那个

别人的代码是真的优雅
这个代码先记录了nums1中每个元素出现的次数到umap中
再在nums2中for每个元素
如果元素在umap中有记录则将其push进res,并且umap记录数–

假如nums1中才是数字出现少的那个,那么umap[nums1]会先到0,以至于res不了nums2的元素,假如nums2才是数字出现少的那个,那么if(nums2)会先空

太优雅了o(╥﹏╥)o

class Solution {
public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {unordered_map<int, int> umap;vector<int> res;for(int i = 0; i < nums1.size(); i ++) umap[nums1[i]]++;for(int i = 0; i < nums2.size(); i ++){if(umap[nums2[i]]){res.push_back(nums2[i]);umap[nums2[i]] --;}}return res;}
};

7.有序数组的平方

给一个非递减的数组,现在需要你将每个元素都平方,然后递增排序,返回nums。注意,需要时间复杂度是O(n)

sort的家伙,以后面试也排人后面!!!!

sort的复杂度是O(nlogn),所以不能用sort,只能用双指针

这里有个十分关键的点,就是:原本的数组本身就是有序的,是一个非递减的数组,那么即使数组中元素有正有负,绝对值最大的元素肯定是在数组的两端的,即数组平方的最大值是在数组的两端的。

所以我们可以使用两个双指针i,j一个指向起始位置,一个指向数组的末尾。
定义一个新的数组result用于储存新的有序平方后的元素。

class Solution {
public://双指针vector<int> sortedSquares(vector<int>& A) {int k = A.size() - 1; //指向新数组的末尾,从后往前赋值vector<int> result(A.size(), 0);for (int i = 0, j = A.size() - 1; i <= j;) { // 注意这里要i <= j,因为最后要处理两个元素if (A[i] * A[i] < A[j] * A[j]) { //判断条件1:尾部元素更大result[k--] = A[j] * A[j];j--;}else {result[k--] = A[i] * A[i]; //判断条件2:头部元素更大i++;}}return result;}
};

8.删除有序数组中的重复项II

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

前2个肯定不用删,所以可以跳过,从j = 2开始比
还是太优雅了这代码

二刷debug:不会,很难理解

class Solution {
public:int removeDuplicates(vector<int>& nums) {if(nums.size() <= 2) return nums.size();int i = 2;for(int j = 2; j < nums.size(); j ++){if(nums[j] != nums[i - 2]){nums[i] = nums[j];i ++;}}return i;}
};

9.寻找重复数

在这里插入图片描述

不可以用sort也不可以用额外数组
这个要求真的是把我路都堵死了…
二刷debug:不会…
数组小技巧:数组也可以看做链表来做
以图为例,天然就有数组链表0->1->3->2->4
fast = nums[nums[fast]]相当于fast = fast->next->next
slow = nums[slow]相当于slow = slow->next
在这里插入图片描述
几刷?:容易写成return nums[slow],实际上最后一个是slow = nums[slow],所以直接写成return slow就可以了

class Solution {
public:int findDuplicate(vector<int>& nums) {int fast = 0, slow = 0;while(true){fast = nums[nums[fast]];slow = nums[slow];if(fast == slow) break;}slow = 0;while(fast != slow){fast = nums[fast];slow = nums[slow];}return slow;}
};

10.水果成篮

fruits数组,fruits[i]代表一种水果,比如fruits[2] = 1,,代表香蕉
现在有fruits.size()棵水果树,每次只能摘一颗树
现在有2个篮子,每个篮子装一种水果,问最多能摘多少棵数

fruit = [1,2,1],有两种水果树,所以能摘三棵,都能摘,篮子装得下

滑动窗口。要注意不需要window.size() == need,也要计算len,因为有while(window.size() > need)在,窗口不是小了就是刚刚好,不可能大,如果fruit的水果树种类本来就不足2个,就可以返回
另外,当缩小窗口,导致其中一个苹果树没了,window应该erase掉。否则还占用一个size

二刷debug:小于等于2的水果树种类也可以,另外unordered_map类型可以使用erase

class Solution {
public:int totalFruit(vector<int>& fruits) {unordered_map<int, int> window;int need = 2;int len = 0;int left = 0, right = 0;while(right < fruits.size()){int c = fruits[right];right++;window[c]++;;while(window.size() > need){int d = fruits[left];left++;window[d]--;if(window[d] == 0) window.erase(d);}len = max(len, right - left);}return len;}
};

相关文章:

codetop标签双指针题目大全解析(三),双指针刷穿地心!!!!!

复习比学习更重要&#xff0c;更需要投入时间&#xff0c;更需要花费精力 1.字符串的排列2.找出字符串中第一个匹配的下标3.最大连续1的个数II4.数组中的山脉5.移除元素6.两个数组的交集II7.有序数组的平方8.删除有序数组中的重复项II9.寻找重复数10.水果成篮 1.字符串的排列 …...

HarmonyOS应用六之应用程序进阶一

目录&#xff1a; 1、UIAbility的冷启动和UIAbility热启动2、静态资源和动态资源的访问3、页面跳转3.1、页面返回跳转 4、HAR的ArkUI组件、接口、资源&#xff0c;供其他应用或当前应用的其他模块引用4.1、导出HAR的ArkUI组件4.2、引用HAR的ArkUI组件 5、循环渲染6、状态管理最…...

vue开发中变量第一次双向绑定无效,界面并没有变化,第二次则又好了。

这个问题出现的太频繁了,基本大部分用户都遇到这个情况。大部分是弹框的情况。代码如下: <el-dialog:visible.sync="isShowCode" @close="closeCode()"><div class="u4259f"><edite-edite-code isNoShowClose="true"…...

C++基础(8)——string的相关面试题

目录 1.字符串转成整数 2.字符串相加 3.高精度加法模板&#xff08;acwing&#xff09; 4.验证回文串 1.字符串转成整数 题目&#xff1a;将一个字符串转换成一个整数&#xff0c;要求不能使用字符串转换整数的库函数。数值为0或者字符串不是一个合法的数值则返回0。输入的…...

【Docker】06-DockerCompose

1. Docker compose 2. Docker Compose部署项目 docker-compose.yml version: "3.8"services:mysql:image: mysqlcontainer_name: mysqlports:- "3307:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "/root/docker/mysql/…...

代码随想录训练营Day27 | 77. 组合 | 216.组合总和III | 17.电话号码的字母组合

学习文档&#xff1a;代码随想录 (programmercarl.com) 视频链接&#xff1a;代码随想录算法公开课 | 最强算法公开课 | 代码随想录 (programmercarl.com) Leetcode 77. 组合 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以…...

Linux文件重定向文件缓冲区

目录 一、C文件接口 二、系统文件I/O 2.1认识系统文件I/O 2.2系统文件I/O 2.3系统调用和库函数 2.4open( )的返回值--文件描述符 2.5访问文件的本质 三、文件重定向 3.1认识文件重定向 3.2文件重定向的本质 3.3在shell中添加重定向功能 3.4stdout和stderr 3.5如何理…...

训练贪吃蛇ai的后续记录

发现可以结合遗传算法的思路&#xff0c;产生更好的效果。 即每训练一段时间&#xff0c;就停下来测试一下新模型的效果。如果效果优于记录中最好的&#xff0c;则继续导入该模型并训练。重复几次&#xff0c;效果可能更好。 例如&#xff0c;昨晚我便通过唯一一个在十次测试中…...

WPF 手撸插件 八 操作数据库一

1、本文将使用SqlSugar创建Sqlite数据库&#xff0c;进行入门的增删改查等操作。擦&#xff0c;咋写着写着凌乱起来了。 SqlSugar官方文档&#xff1a;简单示例&#xff0c;1分钟入门 - SqlSugar 5x - .NET果糖网 2、环境SqlSugar V5.0版本需要.Net Framework 4.6 &#xff0…...

代数结构基础 - 离散数学系列(八)

目录 1. 群&#xff08;Group&#xff09; 群的定义 群的示例 2. 环&#xff08;Ring&#xff09; 环的定义 环的示例 3. 域&#xff08;Field&#xff09; 域的定义 域的示例 域在密码学中的应用 4. 实际应用场景 1. 对称性与加密 2. 误差检测与纠正 3. 数据编码…...

函数的arguments为什么不是数组?如何转化为数组?

因为arguments本身并不能调用数组方法&#xff0c;它是一个另外一种对象类型&#xff0c;只不过属性从0开始排&#xff0c;依次为0 1 2…最后还有callee和length属性&#xff0c;我们也把这样的对象成为类数组。 常见的类数组还有&#xff1a; 1.用getElementsByTagName/Class…...

Java之反射

目录 反射 定义 主要用途 反射相关的类 Class类中【获得类相关方法】 Class类中【获得类中属性相关的方法】 Class类中【获得类中注解相关的方法】 Class类中【获得类中构造器相关的方法】 Class类中【获得类中方法相关的方法】 获得Class对象 代码示例1 代码示例…...

3dsMax添加天空盒

点击渲染&#xff0c;环境 &#xff0c; 点击位图 找到要设置的天空HDR&#xff0c;可以使用HDR(EXR)贴图 一个可以下载HDR贴图的网站 https://polyhaven.com/hdris在渲染的时候不要使用使用微软输入法&#xff0c;3dsmax会卡死&#xff0c; 在渲染的时候不要使用使用微软…...

C语言的类型提升机制

概念 在C语言中&#xff0c;整数类型按照其大小可以分为以下几类&#xff08;从小到大&#xff09;&#xff1a; charshortintlonglong long 当在表达式中涉及这些类型的混合运算时&#xff0c;较小的类型会被提升为较大的类型。具体规则如下&#xff1a; ①char 和 short …...

Pandas和Seaborn数据可视化

Pandas数据可视化 学习目标 本章内容不需要理解和记忆&#xff0c;重在【查表】&#xff01; 知道数据可视化的重要性和必要性知道如何使用Matplotlib的常用图表API能够找到Seaborn的绘图API 1 Pandas数据可视化 一图胜千言&#xff0c;人是一个视觉敏感的动物&#xff0c;大…...

爬虫(Python版本)

1.爬虫的法律问题 爬虫技术&#xff08;Web Scraping&#xff09;指通过程序自动访问网页并提取其中的数据。在使用爬虫的过程中&#xff0c;涉及到一些法律法规和合规性问题。 常见法律风险 ①未经授权的访问&#xff1a;很多网站对爬虫行为设置了限制。如果未获得授权就进行…...

【分布式训练 debug】VS Code Debug 技巧:launch.json实用参数

VS Code Debug技巧&#xff1a;launch.json实用参数 在使用Visual Studio Code (VS Code)进行调试时&#xff0c;launch.json文件是一个强大的工具&#xff0c;它允许你自定义调试会话。以下是一些实用的参数&#xff0c;可以帮助你更有效地调试Python代码。 1. 调试第三方库…...

pycharm连接linux服务器需要提前安装ssh服务

在 Debian 或 Ubuntu 系统上&#xff0c;使用 APT&#xff1a; bash复制代码 sudo apt-get install openssh-server 在基于 RPM 的系统如 CentOS 或 RHEL 上&#xff0c;使用 YUM 或 DNF&#xff1a; bash复制代码 sudo yum install openssh-server 或对于较新的 RHEL/Cent…...

通信工程学习:什么是LAN局域网、MAN城域网、WAN广域网

LAN局域网、MAN城域网、WAN广域网 LAN&#xff08;Local Area Network&#xff0c;局域网&#xff09;、MAN&#xff08;Metropolitan Area Network&#xff0c;城域网&#xff09;和WAN&#xff08;Wide Area Network&#xff0c;广域网&#xff09;是计算机网络中根据覆盖范围…...

LeetCode热题100速通

一丶哈希 1、两数之和&#xff08;简单&#xff09; 给定一个整数数组 n u m s nums nums 和一个整数目标值 t a r g e t target target&#xff0c;请你在该数组中找出 和为目标值 t a r g e t target target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...