力扣 | 双指针技巧

在这里插入图片描述

前文回顾:力扣 | 数组和字符串简介
力扣LeetBook:数组和字符串

文章目录

  • 📚双指针技巧:情形一
    • 👉反转字符串
    • 👉数组拆分I
    • 👉两数之和 II - 输入有序数组
  • 📚双指针技巧:情形二
    • 👉移除元素
    • 👉最大连续1的个数
    • 👉长度最小的子数组⭐️
  • 📚总结
    • 👉杨辉三角
    • 👉杨辉三角II
    • 👉反转字符串中的单词 III
    • 👉寻找旋转排序数组中的最小值
    • 👉删除排序数组中的重复项
    • 👉移动零

📚双指针技巧:情形一

反转数组中的元素。比如数组为 [‘l’, ‘e’, ‘e’, ‘t’, ‘c’, ‘o’, ‘d’, ‘e’],反转之后变为 [‘e’, ‘d’, ‘o’, ‘c’, ‘t’, ‘e’, ‘e’, ‘l’]。

使用双指针技巧,其思想是分别将两个指针分别指向数组的开头及末尾,然后将其指向的元素进行交换,再将指针向中间移动一步,继续交换,直到这两个指针相遇。
在这里插入图片描述在这里插入图片描述

👉反转字符串

class Solution {
public:void reverseString(vector<char>& s) {if(s.size()==0) return ;for(int i=0,j=s.size()-1 ;i<j ; i++,j--) {char temp=s[i];s[i]=s[j];s[j]=temp;}}
};

在这里插入图片描述

👉数组拆分I

直接排序取奇数位要啥双指针

class Solution {
public:int arrayPairSum(vector<int>& nums) {sort(nums.begin(),nums.end());int sum=0;for(int i=0;i<nums.size();i+=2){//先排序然后取奇数位求和sum += nums[i];}return sum;}
};

在这里插入图片描述

👉两数之和 II - 输入有序数组

由于数组从小到大排列, 双指针分别指向首部和尾部;

  • 首部尾部相加等于目标值,返回结果集
  • 首部尾部相加小于目标值,首部后移变大
  • 首部尾部相加大于目标值,尾部前移变小
class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {int head=0,tail=numbers.size()-1;while(head<tail){if(numbers[head]+numbers[tail]<target){//首部尾部相加小于目标值,首部后移变大head++;}else if(numbers[head]+numbers[tail]>target){//首部尾部相加大于目标值,尾部前移变小tail--;}else{//首部尾部相加等于目标值,返回结果集return{head+1,tail+1};}}return{0,0};}
};

在这里插入图片描述

📚双指针技巧:情形二

有时,我们可以使用两个不同步的指针来解决问题,即快慢指针。与情景一不同的是,两个指针的运动方向是相同的,而非相反。让我们从一个经典问题开始:

  • 给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。

采用快慢指针的思想:初始化一个快指针 fast 和一个慢指针 slow,fast 每次移动一步,而 slow 只当 fast 指向的值不等于 val 时才移动一步。
在这里插入图片描述
在这里插入图片描述

👉移除元素

class Solution {
public:int removeElement(vector<int>& nums, int val) {int slow=0;for (int fast=0;fast<nums.size();fast++) {//fast 每次移动一步,//而 slow 只当 fast 指向的值不等于 val 时才移动一步。if(nums[fast]!=val) {nums[slow]=nums[fast];slow++;}}return slow;}
};

在这里插入图片描述

👉最大连续1的个数

class Solution {
public:int findMaxConsecutiveOnes(vector<int>& nums) {int res=0,temp=0;for(int i=0;i<nums.size();i++) {//记录连续1的个数并及时更新temp=(nums[i]==1)?(temp+1):0;res=max(res,temp);}return  res;}
};

在这里插入图片描述

👉长度最小的子数组⭐️

参考讨论区大佬题解——双指针+尺取法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int fast=0,slow=0;//快慢指针int sum=0,length=nums.size()+1;//用于求和,最短长度更新for(;fast<nums.size();fast++){sum+=nums[fast];//快指针移动求和if(sum>=target)                         {//达到目标后进行收缩while(1){   //慢指针可以往后移动多少if(sum-nums[slow]>=target) {sum-=nums[slow];slow++;}else break;}if(fast-slow+1<length) length=fast-slow+1;//更新最小长度}}if(length<nums.size()+1) return length;//判断是否存在符合要求的子数组else return 0;}
};

在这里插入图片描述

📚总结

👉杨辉三角

class Solution {
public:vector<vector<int>> generate(int numRows) {vector<vector<int>> ret;//​​vector<int>(a, b)​的意思是创建一个大小为 ​a​的vector,并将其所有元素初始化为 ​b​。//创建一个大小为1的vector,并将其所有元素初始化为1ret.push_back(vector<int>(1,1));//设定第一层for(int i=1;i<numRows;i++){vector<int> a(i+1);//每一层对应的数组for(int j=0;j<=i;j++){if(j==0||j==i) a[j]=1;else a[j]=ret[i-1][j-1]+ret[i-1][j];}ret.push_back(a);}return ret;}
};

在这里插入图片描述

👉杨辉三角II

参考讨论区【序散】
在这里插入图片描述

class Solution {
public:vector<int> getRow(int rowIndex) {//​​vector<int>(a, b)​的意思是创建一个大小为 ​a​的vector,并将其所有元素初始化为 ​b​。vector<int> res(rowIndex+1,1);if (rowIndex<2) return res;//前两层都是1for(int i=1;i<rowIndex;i++){for(int j=i;j>0;j--)res[j]=res[j-1]+res[j];}return res;}
};

在这里插入图片描述

👉反转字符串中的单词 III

  • 首先遍历整个字符串,找到每个单词的起始位置和结束位置。
  • 然后对每个单词进行反转。
  • 最后返回反转后的字符串。
class Solution {
public:string reverseWords(string s) {int i=0;int n=s.size();while(i<n) {int start=i;while(i<n && s[i]!=' ') {//找到单词的起始位置i++;}int end=i-1;// 反转单词while(start<end) {swap(s[start],s[end]);start++;end--;}i++; //下一个单词}return s;}
};

在这里插入图片描述

👉寻找旋转排序数组中的最小值

class Solution {
public:int findMin(vector<int>& nums) {//直接排序找最小sort(nums.begin(),nums.end());return nums[0];}
};

在这里插入图片描述

👉删除排序数组中的重复项

class Solution {
public:int removeDuplicates(vector<int>& nums) {int fast=0;int slow=0;while(fast<(nums.size()-1)){//双指针移动fast++;if(nums[fast]!=nums[fast-1]){slow++;nums[slow]=nums[fast];}}return (slow+1);}
};

在这里插入图片描述

👉移动零

class Solution {
public:void moveZeroes(vector<int>& nums) {int slow=0,fast=0;while(fast<nums.size()){//先排好所有非零元素if(nums[fast]!=0){nums[slow]=nums[fast];slow++;}fast++;}for(;slow<nums.size();slow++){//再补0nums[slow]=0;}}
};

在这里插入图片描述


代办清单👇
在这里插入图片描述

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

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

相关文章

使用OpenCV检测两张图片的关键点并计算关键点的描述子

#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/highgui/highgui.hpp>

大数据之路—数据架构体系及模型设计

大数据之路—数据架构体系及模型设计 一、阿里巴巴数据整合及管理体系二、维度设计1、基本概念2、规范化和反规范化3、维度整合4、维度拆分5、维度变化6、特殊维度 三、事实表设计1、事实表特性2、事实表类型3、事实表设计原则4、事务事实表5、周期快照事实表的注意事项6、累计…

初识TCP/IP网络编程

学习自《TCP/IP网络编程》 客户端&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> void error_handling(char * message);int main(int…

Codeforces Round 883 (Div. 3)

A. Rudolph and Cut the Rope 只需要按照钉子距离的高度 a i a_{i} ai​和绳子的长度 b i b_{i} bi​的差值进行排序即可 代码 int n; pii a[N]; bool cmp(pii a,pii b) {return a.x-a.y<b.x-b.y; }void solve() {cin>>n;for(int i1;i<n;i)cin>>a[i].x>…

【Linux】oh-my-zsh终端配置

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍oh-my-zsh终端配置。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&am…

深度学习不同数据增广方法的选用分析

一般情况下&#xff0c;可以将数据扩增方法分为单数据变形、多数据混合、学习数据分布规律生成新数据和学习增广策略等4 类方法。以上顺序也在一定程度上反映了数据增广方法的发展历程。如果与Shorten和Khoshgoftaar的成果对照&#xff0c;就图像数据而言&#xff0c;基于数据变…

CTFHub XSS DOM反射 WriteUp

前言&#xff1a;本文需要注册一个xss平台&#xff0c;以接收xss反弹回来的数据&#xff0c;请自己在互联网上寻找合适的xss平台 1. 构造闭合语句 根据题目提示&#xff0c;判断网站存在DOM xss漏洞 查看页面源代码&#xff0c;发现关键位置&#xff0c;其中CTFHub is very n…

用android studio 测试发行包

在google play 发行app&#xff0c;需要用bundle&#xff0c;而不是apk。 bundle 比apk 要小很多&#xff0c;比如我的app-release.aab 29,736 KB&#xff0c; 而app-release.apk 是62,305KB。这就是少了一半多。但是apk 直接复制就可以安装&#xff0c;bundle 需要上传google…

实例解释在lingo中使用集合模型

某部门有三个生产同一产品的工厂&#xff08;产地&#xff09;&#xff0c;生产的产品运往四个销售点&#xff08;销地&#xff09;出售&#xff0c;各个工厂的生产量、各销地的销量&#xff08;单位&#xff1a;吨&#xff09;、从各个工厂到各个销售点的单位运价&#xff08;…

【若依】框架搭建,前端向后端如何发送请求,验证码的实现,开启注册功能

若依框架 若依框架&#xff08;Ruoyi&#xff09;是一款基于Spring Boot和Spring Cloud的开源快速开发平台。它提供了一系列的基础功能和通用组件&#xff0c;能够帮助开发者快速构建企业级应用。若依框架采用了模块化的设计理念&#xff0c;用户可以选择需要的功能模块进行集…

ChatGPT炒股:批量自动提取股票公告中的表格并合并数据

首先&#xff0c;在ChatGPT中输入提示词&#xff1a; 写一段Python代码&#xff1a; F盘文件夹“新三板 2023年日常性关联交易20230704”中很多个PDF文件&#xff0c;用 Tabula提取这些PDF文件中第1页中的第2个表格&#xff0c;然后保存到表格文件中&#xff0c;文件标题名和…

springboot+echarts+mysql制作数据可视化大屏(滑动大屏)

作者水平低&#xff0c;如有错误&#xff0c;恳请指正&#xff01;谢谢&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 项目简单&#xff0c;适合大学生参考 分类专栏还有其它的可视化博客哦&#xff01; 专栏地址&#xff1a;https://blog.csdn.net/qq_559…