双指针算法(题目与答案讲解)

文章目录

  • 题目
    • 移动零
    • 复写零
    • 两数之和
    • N数之和(>2个数)
  • 答案讲解
    • 移动零
    • 复写零
    • 两数之和
    • N数之和

题目

力扣

移动零

1、移动零:题目链接

复写零

2、复写零:题目链接

两数之和

3、两数之和题目链接

N数之和(>2个数)

4、N数之和(三个数、四个数·····)
三个数:题目链接
四个数题目链接

答案讲解

移动零

思路

移动零:这个题目是利用双指针算法
双指针不一定是用2个指针,可以是下标或者值来代替
拿案例1来讲
让一个left指向-1 这个位置
让一个right指向0 这个位置
让right 走 如果right下标的数不为0
那么left++, swap(nums[left],nums[right])
让right继续走 如果遇到0 那么 left不动 那么left的下一个数必定为0
交换完之后 0就会到后面去
在这里插入图片描述

代码

class Solution {
public:
    void moveZeroes(vector<int>& nums) 
    {
        int cur = 0;
        int dest = -1;
        while(cur<nums.size())
        {
            if(nums[cur]!=0)
            {
                dest++;
                swap(nums[cur],nums[dest]);
            }
            cur++;
        }
    }
};

复写零

思路

复写零
同样也是用双指针
先找到要复写之后最后一个数
这么找?
用下标 一个定义cur为0 dest为-1
cur和dest同时++
如果cur下标的数为0
那么dest多++一次
如果dest走到最后一个元素那么就结束
cur位置就是最后复写的数
但是有一个小细节
因为如果最后一个要复写的数(cur位置为size-2的位置)并且为0
那么dest可能越界
所以要判断一下dest是否会越界
如果是这个情况
数组最后一个数置为0
另一个0 因为越界了所以不用管
并且让cur–,dest-=2
这样子他们就不会越界了
找到需要复写的数下标cur之后
从后往前遍历
把cur下标位置的值赋值到dest位置下
如果cur下标位置为0
那么就让dest位置++2次并且复写2次0
在这里插入图片描述

代码:

class Solution {
public:
    void duplicateZeros(vector<int>& arr) 
    {
        vector<int> s;
        int cur =0;
        int dest = -1;
        while(cur<arr.size())
        {
            if(arr[cur])
            {
                dest++;
            }
            else
            {
                dest+=2;
            }
            if(dest>=arr.size()-1)
            {
                break;
            }
            cur++;
        }
        if(dest==arr.size())
        {
            arr[arr.size()-1]=0;
            cur--;
            dest-=2;
        }
        while(cur>=0)
        {
            if(arr[cur])
            {
                 arr[dest--]=arr[cur--];
            }
            else
            {
                arr[dest--]=arr[cur];
                arr[dest--]=arr[cur];
                cur--;
            }
           
        }
        
    }
};

两数之和

思路

同样是双指针算法
这个是升序的数组
定义一个下标为0的left和一个数组长度-1的数right
还有定义一个vector 用来接受最后的2个数
用下标left的数+下标为right的数 = 一个数
如果这个数大于target
那么吧right-- 因为是升序把大的干掉
如果小于
把left++ 把小的干掉
在这里插入图片描述

代码 :

class Solution {
public:
    vector<int> twoSum(vector<int>& price, int target) 
    {
        vector<int> s;
        int left = 0,right = price.size()-1;
        while(left<right)
        {
            if(price[left]+price[right]>target)
            {
                right--;
            }
            else if(price[left]+price[right]<target)
            {
                left++;
            }
            else
            {
                s.push_back(price[left]);
                s.push_back(price[right]);
                break;
            }
        }
        return s;      
    }
};

N数之和

三个数
题目解析:
在这里插入图片描述

要3个数相加=0 并且不能重复

思路

因为要找出三个数的和为0
优质解法是双指针
先定一个i让i指向下标为0这个数
然后在[1,nums.size()-1]中定义一个left 指向i+1这个位置 right 指向 size()-1这个位置
一个数(B)接收 i下标位置的数并改成 他的相反数
这有一个小细节:如果 i下标位置>0那么 他后面的数都不用算了,因为>0的数相加肯定大于0
然后让一个数来接受left下标和right下标的数的和
如果这个和大于B 那么把大的干掉
如果小于 那么把小的干掉
找到之后吧他插入到vector中 然后left++ ,right–
去重(★)
如果left 位置和他的前一个位置 left-1的值相同 那么就++
因为如果 相同那么都判断过了 他插入也是插入重复的
题目不要重复的 所以直接++,一直++到不重复的为止
right也是一样 不过right是判断和他+1位置的值,如果相等那么–

四个数就是定2个数然后再后面的区间找

代码:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) 
    {
        sort(nums.begin(),nums.end());//排序吧数组变成有序
        vector<vector<int>> arr;
        for(int i = 0;i<nums.size();)
        {
            int left = i+1,right = nums.size()-1;
            int a = -nums[i];
            if(nums[i]>0)
            {
                //如果大于0 那么就说明后面的都是正数 正数+正数!= 比他们两个小的正数
                break;
            }
            while(left<right)
            {
                if(nums[left]+nums[right]>a)
                {
                    right--;
                }
                else if(nums[left]+nums[right]<a)
                {
                    left++;
                }
                else
                {
                    //{}扩起来的内容会形成一个vector 的数组扔到里面
                    arr.push_back({nums[i],nums[left],nums[right]});
                    left++;
                    right--;
                    //去重操作
                    while(left<right&& nums[left]==nums[left-1])
                    {
                        left++;
                    }
                    while(left<right&& nums[right]==nums[right+1])
                    {
                        right--;
                    }
                }
            }
            //对nums[i]这个位置去重
            i++;
            while(i<nums.size() &&nums[i]==nums[i-1])
            {
                i++;
            }
        }
        return arr;      
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TDI网络过滤驱动应用(一)

文章目录 TDI网络过滤驱动应用1. 技术概览2. 数据包的抓取3. 应用实例3.1 TrafficShaper(限流)3.2 DnsRedirector(DNS重定向)3.3 TcpRedirector(TCP重定向) 4. 总结与参考 TDI网络过滤驱动应用 在前面的文章中&#xff0c;我们分析了TDI网络过滤驱动的基本开发框架以及TDI网络…

计算机视觉:使用dlib实现人脸检测

1 dlib介绍 Dlib是一个广泛使用的开源库&#xff0c;在计算机视觉和机器学习领域具有重要影响。它是由Davis King在2002年开发&#xff0c;主要用C语言编写&#xff0c;但也提供了Python接口。Dlib结合了高效的算法和易用性&#xff0c;使其成为学术界和工业界的热门选择。 1.…

VR特警野外武装仿真虚拟训练实操教学保证训练效果

特警VR模拟仿真训练软件的优势主要体现在以下几个方面&#xff1a; 真实感和沉浸感&#xff1a;通过VR技术&#xff0c;特警可以在虚拟环境中体验真实的训练场景&#xff0c;如人质解救、反恐行动等。这种真实感和沉浸感可以帮助特警更好地理解和适应实际情况&#xff0c;提高训…

香港人均gdp世界排名,和内地相比怎么样?

香港人均gdp世界排名&#xff0c;和内地相比怎么样&#xff1f; 香港作为世界贸易港口&#xff0c;也是中国最发达的城市之一。其经济相比于北上广深而言&#xff0c;都要发达。香港人均收入世界排名第18&#xff0c;人均收入为4.2万美元&#xff0c;在世界各国人均收入排名中处…

【古月居《ros入门21讲》学习笔记】09_订阅者Subscriber的编程实现

目录 说明&#xff1a; 1. 话题模型 图示 说明 2. 实现过程&#xff08;C&#xff09; 创建订阅者代码&#xff08;C&#xff09; 配置发布者代码编译规则 编译并运行 编译 运行 3. 实现过程&#xff08;Python&#xff09; 创建订阅者代码&#xff08;Python&…

什么是算法?

一、是什么 算法&#xff08;Algorithm&#xff09;是指解题方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法描述解决问题的策略机制 也就是说&#xff0c;能够对一定规范的输入&#xff0c;在有限时间内获得所要求的输出 …

【小聆送书第一期】让架构师的成神之路温暖你这个不景气的冬天

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言 书籍一览 ⛳️书籍一⛳️书籍二⛳️书籍三⛳️书籍四⛳️书籍五⛳️书籍六⛳️书…

【广州华锐视点】AI卡通数字人物帮助企业拓展更广阔的市场空间

随着科技的飞速发展&#xff0c;人类对于虚拟世界的探索愈发深入。从最初的文字和图片&#xff0c;到如今的音频、视频&#xff0c;再到未来可能的虚拟现实&#xff0c;我们一直在寻求与虚拟世界更加紧密的联系。在这个过程中&#xff0c;AI卡通数字人物作为一种新兴的角色&…

操作系统 day14(进程同步、进程互斥、互斥的代码实现)

进程同步 概念 进程的异步性体现在&#xff0c;例如&#xff1a;当有I/O操作时&#xff0c;进程需要等待I/O操作&#xff0c;而每个I/O操作又是不同的&#xff0c;所以进程没有一个固定的顺序&#xff0c;固定的时间来执行&#xff0c;而这体现了进程的异步性。 进程互斥 …

数据库管理-第118期 记一次开启附加日志导致的性能问题(202301129)

数据库管理-第118期 记一次开启附加日志导致的性能问题&#xff08;202301129&#xff09; 本周二凌晨&#xff0c;为了配合某国产数据库从Oracle数据库能够实时同步数据&#xff0c;在X9M那套一体机上做了开启附加日志的操作&#xff0c;也正是因为这个操作带来了一些小问题。…

【STM32】OLED显示屏

1 调试方式 1. 串口调试&#xff1a;通过串口通信&#xff0c;将调试信息发送到电脑端&#xff0c;电脑使用串口助手显示调试信息 2. 显示屏调试&#xff1a;直接将显示屏连接到单片机&#xff0c;将调试信息打印在显示屏上 3. Keil调试模式&#xff1a;借助Keil软件的调试模…

STM32g70开启定时器死机原因

在做低功耗产品时&#xff0c;检查发现由于之前开启了BOOTLOADER升级程序&#xff0c;修改了中断向量FALSH起始地址&#xff0c;只在KEIL TARGET IROM1中修改了&#xff0c; 而忘记在程序文件system_stm32f10x.c里修改中断向量表flash起始地址 system_stm32f10x.c里&#xff0…

微信预约小程序制作

对于许多新手来说&#xff0c;制作微信预约小程序可能是一项挑战&#xff0c;但并非不可能。本文将通过详细的步骤&#xff0c;指导您从零开始制作一个微信预约小程序。首先&#xff0c;您需要找一个合适的第三方制作平台或工具&#xff0c;乔拓云网就是其中之一。 找一个合适的…

QT 环境搭建

Qt 5.12.0下载 http://download.qt.io/archive/qt/5.12/5.12.0/ 下载qt-opensource-windows-x86-5.12.0.exe安装

【精选】VulnHub red 超详细过程思路

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

自动化测试工具——Monkey

前言&#xff1a; 最近开始研究Android自动化测试方法&#xff0c;整理了一些工具、方法和框架&#xff0c;其中包括android测试框架&#xff0c;CTS、Monkey、Monkeyrunner、benchmark&#xff0c;以及其它test tool等等。 一、 什么是Monkey Monkey是Android中的一个命令…

Intellij idea 内存不够用了,怎么处理?

目录 如何判断内存不够用了 下面演示一下如何开启内存指示器&#xff08;Memory Indicator&#xff09; 解决方案 第一种&#xff1a;双击"内存指示器(Mempory Indicator)" 第二种&#xff1a;增大Intellij Idea 最大可使用内存 如何判断内存不够用了 运行项目后…

pyhon数据分析A股股票策略实际买卖总结(每月末更新数据)

简介 本篇文章主要记录python数据分析a股股票选股后实际买卖的记录。 选股策略 低位寻股&#xff0c;筛选出低位股价股票已经做过调整的股票&#xff0c;做短线交易&#xff08;不超过7天&#xff09;&#xff0c;不贪&#xff0c;小赚即走。分三个时段&#xff0c;开盘三十…

自动锁螺丝机配件直线模组的作用

直线模组的应用非常广泛&#xff0c;在各种需要高精度、高效率的自动化直线运动的场合都有应用&#xff0c;尤其是在自动锁螺丝机中&#xff0c;起着关键性作用。 1、提供精确的定位和导向&#xff1a;在自动锁螺丝机中&#xff0c;螺丝的拧紧和输送都需要精确控制&#xff0c;…

一种更好的前端组件结构:组件树

本文翻译自 A Better Frontend Component Structure: Component Trees&#xff0c;作者&#xff1a;William Bernting&#xff0c; 略有删改。 自很久以前遵循互联网上的建议以来&#xff0c;我一直采用了某种“能工作就行”的组件结构。 场景 让我们首先想象一个简化的前端应…