力扣 | 双指针技巧

news2024/9/23 11:21:47

在这里插入图片描述

前文回顾:力扣 | 数组和字符串简介
力扣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,并将其所有元素初始化为1
        ret.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;//前两层都是1
        for(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++)
        {//再补0
            nums[slow]=0;
        }
    }
};

在这里插入图片描述


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

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

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

相关文章

基于智能手机的医院服务客户端设计与实现(论文+源码)_kaic

摘 要 近年来&#xff0c;随着中国经济的迅猛发展&#xff0c;医疗技术水平也在不断提高&#xff0c;但由于人口数目巨大&#xff0c;导致医疗资源人均分配不足的情况依旧十分严峻。预约挂号一直是制约医疗机构服务质量提高的主要环节之一。在传统预约挂号方式下&#xff0c;繁…

EMQ X(3):客户端websocket消息收发

在EMQ X Broker提供的 Dashboard 中 TOOLS 导航下的 Websocket 页面提供了一个简易但有效的WebSocket 客户端工具&#xff0c;它包含了连接、订阅和发布功能&#xff0c;同时还能查看自己发送和接收的报文数据&#xff0c;我们期望 它可以帮助您快速地完成某些场景或功能的测试…

ncm格式如何转换为mp3,分享几个方法!

你是否曾在网易云音乐上下载了一些NCM格式的音频文件&#xff0c;但发现无法在其他设备上播放&#xff1f;别担心&#xff0c;记灵在线工具可以帮助你将这些NCM格式转换为常见的MP3格式。今天小编就来分享三种方法&#xff0c;教你如何搞定&#xff01; 方法一&#xff1a;曲线…

C#学习之路-循环

有的时候&#xff0c;可能需要多次执行同一块代码。一般情况下&#xff0c;语句是顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了允许更为复杂的执行路径的多种控制结构。 循环语句允许我们多次执行一个…

Notepad++设置查看函数列表的快捷键

Notepad是一个非常精巧、启动便捷、支持文本自动补全的记事本软件&#xff0c;到2023年7月&#xff0c;已经更新到了v8.5.4版本&#xff0c;这里介绍设置其查看函数列表的快捷键方法。老版本的Notepad&#xff0c;比如Notepad v7.3, 默认查看函数列表的快捷键的为F8&#xff0c…

python PYQT5 键盘,鼠标,绘制,焦点,改变,输入法,事件的方法和使用例子

https://img-blog.csdnimg.cn/7630017d3ee444eab9bdedf8d48d575f.png from PyQt5.Qt import * import sys class MyQwidget(QWidget):def __init__(self):super().__init__()def showEvent(self, a0) -> None:print("窗口被展示出来",a0)def closeEvent(self,a0) …

网络编程4——传输层TCP协议的三大安全机制:三次握手四次挥手+确认应答机制+超时重传机制

文章目录 前言一、TCP协议段与机制TCP协议的特点TCP报头结构TCP协议的机制与特性 二、TCP协议的 连接管理机制 TCP建立连接&#xff1a;三次握手 TCP断开连接&#xff1a;四次挥手 三、TCP协议的 确认应答机制 四、TCP协议的 超时重传机制 总结 前言 本人是一个刚刚上路的I…

快速入门QT大法

QT大法 个人博客地址&#xff1a;https://zjxweb.github.io/#/ 1. 入门介绍 1.1 版本控制工具 svn vss git 1.2 QT 优点 跨平台接口接单&#xff0c;容易上手一定程度上简化了内存回收 2. 创建第一个QT程序 2.1 流程 点击创建项目后&#xff0c;选择项目路径以及给项目…

计算机体系结构基础知识介绍之指令集并行的基本编译器技术(循环展开、基本管道调度)

一、基本管道调度和循环展开 为了保持管道满载&#xff0c;必须通过查找可以在管道中重叠的不相关指令序列来利用指令之间的并行性。 为了避免流水线停顿&#xff0c;相关指令的执行必须与源指令分开一定的时钟周期距离&#xff0c;该距离等于该源指令的流水线延迟。 编译器执…

linux内核TCP/IP源码浅析

目录 数据接收流程图硬件层网络层ip_rcvip_rcv_coreip_rcv_finish 和 ip_rcv_finish_coreip_local_deliverip_local_deliver_finish 和 ip_protocol_deliver_rcu 传输层tcp_v4_rcvtcp_v4_do_rcvtcp_rcv_state_processtcp_rcv_establishedtcp_recvmsg 数据结构socketsocksock_co…

允许Traceroute探测漏洞和ICMP timestamp请求响应漏洞解决方法(三)

目录 服务器检测出了漏洞需要修改 1.允许Traceroute探测漏洞解决方法 2、ICMP timestamp请求响应漏洞 服务器检测出了漏洞需要修改 1.允许Traceroute探测漏洞解决方法 详细描述 本插件使用Traceroute探测来获取扫描器与远程主机之间的路由信息。攻击者也可以利用这些信息来…

Chapter 3: Conditional | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介Chapter 3: Conditional executionBoolean expressionsLogical operatorsConditional executionAlternative executionChained conditionalsNested conditionalsCatching exceptions using try and exceptShort-circuit evaluation of lo…

从零开始simulink自定义代码生成----自定义硬件驱动库文件(3)

文章目录 前言C mex文件mdlInitializeSizesmdlInitializeSampleTimesmdlOutputsmdlTerminatemdlRTWc文件结尾编译c文件 tlc文件Start函数Outputs函数模型及生成的代码 总结 前言 在很早的时候&#xff0c;做过一些Simulink自定义硬件驱动库的相关探索&#xff0c;但是后面没有…

惊喜!Alibaba架构师终于发布“微服务架构与实践”文档

前言&#xff1a; 对于微服务架构的概念&#xff0c;相信大家应该都不陌生&#xff0c;无论使用 Apache Dubbo、还是 Spring Cloud&#xff0c;都可以去尝试微服务&#xff0c;把复杂而庞大的业务系统拆分成一些更小粒度且独立部署的 Rest 服务。 但是这个过程&#xff0c;具…

单表查询练习

查看表的字符集编码 show create table tbname; 查看系统默认字符集 SHOW VARIABLES LIKE character_set_database; 显示所有可用的字符集 SHOW CHARACTER SET; 修改系统默认字符集 ①在 /etc/my.cnf 文件中的 [mysqld] 下添加&#xff1a; ②重启数据服务 systemctl re…

Linux:PXE网络装机

要实现需要开启以下服务 dhcp --- 开机没有u盘或光盘的引导电脑会去寻找网络中的引导 tftp --- 用于引导系统 ftp&& http --- 制作yum仓库让引导的系统去ftp或者http上找rpm包 1.ftp&& http yum仓库搭建 Linux&#xff1a;YUM仓库服务_鲍海超-GNUBHC…

Mycat【Mycat安全设置(SQL拦截白名单、SQL拦截黑名单、Mycat-web安装 )】(九)-全面详解(学习总结---从入门到深化)

目录 Mycat安全设置_user标签权限控制 Mycat安全设置_privileges标签权限控制 Mycat安全设置_SQL拦截白名单 Mycat安全设置_SQL拦截黑名单 Mycat性能监控_Mycat-web安装 Mycat性能优化 Mycat实施指南 Mycat安全设置_user标签权限控制 目前 Mycat 对于中间件的连接控制并…

Mac矢量绘图工具 Sketch

Sketch是一款适用于 UI/UX 设计、网页设计、图标制作等领域的矢量绘图软件&#xff0c; 其主要特点如下&#xff1a; 1. 简单易用的界面设计&#xff1a;Sketch 的用户界面简洁明了&#xff0c;使得用户可以轻松上手操作&#xff0c;不需要复杂的学习过程。 2. 强大的矢量绘图功…

Lua快速入门笔记

文章目录 Lua快速入门笔记前言1、Lua概述2、Lua环境安装3、快速体验Lua编程4、数据类型5、变量6、循环7、流程控制8、函数9、运算符10、字符串11、数组12、迭代器13、表14、模块与包15、元表16、协同程序 Lua快速入门笔记 前言 本文是笔者参考菜鸟教程对Lua的一个快速入门学习&…

2023-07-08:RabbitMQ如何做到消息不丢失?

2023-07-08&#xff1a;RabbitMQ如何做到消息不丢失&#xff1f; 答案2023-07-08&#xff1a; 1.持久化 发送消息时设置delivery_mode属性为2&#xff0c;使消息被持久化保存到磁盘&#xff0c;即使RabbitMQ服务器宕机也能保证消息不丢失。同时&#xff0c;创建队列时设置du…