双指针优质算法题集

目录

一、双指针算法介绍

二、移动0

1、题目链接

2、题解

3、代码实现

(1)、初次实现:

(2)、优化后的实现:

二、复写0

1、题目链接:

2、题解

3、代码实现


一、双指针算法介绍

这里的指针不是真的指针,是数组下标

常见两种双指针形式:

(1)、对撞指针:从两端向中间移动。⼀个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼近。对撞指针的终⽌条件⼀般是两个指针相遇或者错开。

(2)、快慢指针:⼜称为⻳兔赛跑算法,其基本思想就是使⽤两个移动速度不同的指针在数组或链表等序列结构上移动。这种⽅法对于处理环形链表或数组⾮常有⽤

快慢指针的实现⽅式有很多种,最常⽤的⼀种就是:

在⼀次循环中,每次让慢的指针向后移动⼀位,⽽快的指针往后移动两位,实现⼀快⼀慢。

二、移动0

1、题目链接

283. 移动零 - 力扣(LeetCode)icon-default.png?t=O83Ahttps://leetcode.cn/problems/move-zeroes/description/

2、题解

这类题通常被称为数组划分或者数组分块,如下:

分析:

(1)、两个指针dest和cur的作用:

cur:从左向右扫描数据,遍历数组;

dest:指向已处理的区间内,非零元素的最后一个位置;

(2)、三个区间:[0,dest]  [dest+1,cur-1]   [cur,n-1]

(3)、如何做到:

       

3、代码实现

(1)、初次实现:

         

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[dest],nums[cur]);}cur++;}}
};

(2)、优化后的实现:

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

二、复写0

1、题目链接:

https://leetcode.cn/problems/duplicate-zeros/description/icon-default.png?t=O83Ahttps://leetcode.cn/problems/duplicate-zeros/description/

2、题解

该题可使用双指针解法:

先根据“异地操作”,即开辟一个新数组,两个数组上进行分析,然后优化成双指针下的“就地”操作。然后一定要多画图分析再进行写代码。

具体步骤可分为三步:先找到最后一个复写的数、处理边界情况、从后往前完成复写操作。

(1)、先找到最后一个复写的数:

该步骤也需要用双指针,指针cur起始值为0,指针dest起始值为-1,然后开始循环比较,如果cur指向的值等于0,则dest += 2,即向后走两步,反之如果不等于0,则dest++,即向后走一步。当dest走完原数组时,cur刚好指向最后一个需要复写的数。

 //找最后一个复写的数int dest = -1,cur = 0;int n = arr.size();while(cur < n){if(arr[cur] == 0){dest += 2;}else{dest++;}if(dest >= n - 1)break;cur++;}   

(2)、处理边界情况:

在(1)的算法下有个漏洞,即若dest指针走到数组的倒数第二个数时,并且最后一个复写的数为0,那么dest向后走两步就会越界,此时需要进行单独处理,先将最后一个数写为0,然后将dest定位到cur位置,在进行第三步。

//处理边界情况,若进入,提前处理最后一个复写的数if(dest == n){dest--;arr[dest--] = 0;cur--;}

(3)、从后往前完成复写操作:

前两步完成后就进入一个循环,然后判断cur处的值:若为0,则dest从后往前将两个位置写成0;若不为0,则dest从后往前复写一个位置的数。

 //从后往前进行复写while(cur >= 0){if(arr[cur] == 0){arr[dest--] = 0;arr[dest--] = 0;cur--;}else{arr[dest] = arr[cur];dest--;cur--;}}

3、代码实现

 void duplicateZeros(vector<int>& arr) {//找最后一个复写的数int dest = -1,cur = 0;int n = arr.size();while(cur < n){if(arr[cur] == 0){dest += 2;}else{dest++;}if(dest >= n - 1)break;cur++;}   //处理边界情况,若进入,提前处理最后一个复写的数if(dest == n){dest--;arr[dest--] = 0;cur--;}//从后往前进行复写while(cur >= 0){if(arr[cur] == 0){arr[dest--] = 0;arr[dest--] = 0;cur--;}else{arr[dest] = arr[cur];dest--;cur--;}}}

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

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

相关文章

博奥龙黑胶虫去除剂,新品来袭!

形态特征&#xff1a; 大小方面&#xff1a;黑胶虫的直径通常在 0.5~1 微米左右&#xff0c;一般比细菌要小&#xff0c;但在显微镜下仍可明显观察到。 形状方面&#xff1a;其形态不规则&#xff0c;初始呈现点状&#xff0c;随着培养时间的增加其形态可以转变为密集的小黑点…

使用Element UI实现前端分页,及el-table表格跨页选择数据,切换分页保留分页数据,限制多选数量

文章目录 一、前端分页1、模板部分 (\<template>)2、数据部分 (data)3、计算属性 (computed)4、方法 (methods) 二、跨页选择1、模板部分 (\<template>)2、数据部分 (data)3、方法 (methods) 三、限制数量1、模板部分 (\<template>)2、数据部分 (data)3、方法…

HTML5+CSS前端开发[保姆级教学]+基本文本控制标签介绍

引入&#xff1a;Hello&#xff0c;各位编程猿们&#xff01;前几篇文章介绍了软件的安装以及编写新闻文章的代码初体验&#xff0c;这一篇我们来巩固一些这些知识点&#xff0c;复习一下基本文本控制标签&#xff01;&#xff01;&#xff01; 知识点一&#xff1a;基本文本控…

《FreeRTOS任务基础知识以及任务创建相关函数》

目录 1.FreeRTOS多任务系统与传统单片机单任务系统的区别 2.FreeRTOS中的任务&#xff08;Task&#xff09;介绍 2.1 任务特性 2.2 FreeRTOS中的任务状态 2.3 FreeRTOS中的任务优先级 2.4 在任务函数中退出 2.5 任务控制块和任务堆栈 2.5.1 任务控制块 2.5.2 任务堆栈…

AdaBoost 二分类问题

代码功能 生成数据集&#xff1a; 使用 make_classification 创建一个模拟分类问题的数据集。 数据集包含 10 个特征&#xff0c;其中 5 个是有用特征&#xff0c;2 个是冗余特征。 数据集划分&#xff1a; 将数据分为训练集&#xff08;70%&#xff09;和测试集&#xff08;3…

ffmpeg自动手动编译安装

1.下载linux ndk并配置profile文件 本例以android-ndk-r10e为例 vi /etc/profile export NDK_HOME/root/ffmpeg/android-ndk-r10e export PATH P A T H : PATH: PATH:NDK_HOME source /etc/profile 2.下载x264并生成 git clone https://code.videolan.org/videolan/x264.g…

英伟达基于Mistral 7B开发新一代Embedding模型——NV-Embed-v2

我们介绍的 NV-Embed-v2 是一种通用嵌入模型&#xff0c;它在大规模文本嵌入基准&#xff08;MTEB 基准&#xff09;&#xff08;截至 2024 年 8 月 30 日&#xff09;的 56 项文本嵌入任务中以 72.31 的高分排名第一。此外&#xff0c;它还在检索子类别中排名第一&#xff08;…

Flume1.9.0自定义拦截器

需求 1、在linux日志文件/data/log/moreInfoRes.log中一直会产生如下JSON数据&#xff1a; {"id":"14943445328940974601","uid":"840717325115457536","lat":"53.530598","lnt":"-2.5620373&qu…

RadSystems 自定义页面全攻略:个性化任务管理系统的实战设计

系列文章目录 探索RadSystems&#xff1a;低代码开发的新选择&#xff08;一&#xff09;&#x1f6aa; 探索RadSystems&#xff1a;低代码开发的新选择&#xff08;二&#xff09;&#x1f6aa; 探索RadSystems&#xff1a;低代码开发的新选择&#xff08;三&#xff09;&…

【开发基础】语义化版本控制

语义化版本控制 基础三级结构主版本号次版本号修正版本号 思维导图在node包管理中的特殊规则 参考文件 基础 语义化版本控制是一套通用的包/库的版本管理规范。在各类语言的包管理中都有用到&#xff0c;一般以x.x.x的形式出现在包的命名中。 三级结构 在语义化版本控制中&a…

IDC 报告:百度智能云 VectorDB 优势数量 TOP 1

近日&#xff0c;IDC 发布了《RAG 与向量数据库市场前景预测》报告&#xff0c;深入剖析了检索增强生成&#xff08;RAG&#xff09;技术和向量数据库市场的发展趋势。报告不仅绘制了 RAG 技术的发展蓝图&#xff0c;还评估了市场上的主要厂商。在这一评估中&#xff0c;百度智…

操作系统——同步

笔记内容及图片整理自XJTUSE “操作系统” 课程ppt&#xff0c;仅供学习交流使用&#xff0c;谢谢。 背景 解决有界缓冲区问题的共享内存方法在并发变量上存在竞争条件&#xff0c;即多个并发进程访问和操作同一个共享数据&#xff0c;从而其执行结果与特定访问次序有关。这种…

IAR调试时输出文本数据到电脑(未使用串口)

说明 因为板子没引出串口引脚&#xff0c;没法接USB转TTL&#xff0c;又想要长时间运行程序并保存某些特定数据&#xff0c;所以找到了这个办法。为了写数据到本机&#xff0c;所以板子必须运行在IAR的debug模式下。 参考&#xff1a;IAR环境下变量导出方法&#xff1a;https…

基于Java Springboot美食食谱推荐系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&…

Java集合(Collection+Map)

Java集合&#xff08;CollectionMap&#xff09; 为什么要使用集合&#xff1f;泛型 <>集合框架单列集合CollectionCollection遍历方式List&#xff1a;有序、可重复、有索引ArrayListLinkedListVector&#xff08;已经淘汰&#xff0c;不会再用&#xff09; Set&#xf…

vue 项目使用 nginx 部署

前言 记录下使用element-admin-template 改造项目踩过的坑及打包部署过程 一、根据权限增加动态路由不生效 原因是Sidebar中路由取的 this.$router.options.routes,需要在计算路由 permission.js 增加如下代码 // generate accessible routes map based on roles const acce…

vue3 中直接使用 JSX ( lang=“tsx“ 的用法)

1. 安装依赖 npm i vitejs/plugin-vue-jsx2. 添加配置 vite.config.ts 中 import vueJsx from vitejs/plugin-vue-jsxplugins 中添加 vueJsx()3. 页面使用 <!-- 注意 lang 的值为 tsx --> <script setup lang"tsx"> const isDark ref(false)// 此处…

uniapp如何i18n国际化

1、正常情况下项目在代码生成的时候就已经有i18n的相关依赖&#xff0c;如果没有可以自行使用如下命令下载&#xff1a; npm install vue-i18n --save 2、创建相关文件 en文件下&#xff1a; zh文件下&#xff1a; index文件下&#xff1a; 3、在main.js中注册&#xff1a…

【视觉SLAM】4b-特征点法估计相机运动之PnP 3D-2D

文章目录 1 问题引入2 求解P3P 1 问题引入 透视n点&#xff08;Perspective-n-Point&#xff0c;PnP&#xff09;问题是计算机视觉领域的经典问题&#xff0c;用于求解3D-2D的点运动。换句话说&#xff0c;当知道n个3D空间点坐标以及它们在图像上的投影点坐标时&#xff0c;可…

wsl2配置文件.wslconfig不生效

问题 今天在使用wsl时&#xff0c;通过以下配置关闭swap内存&#xff0c;但是发现重启虚拟机之后也不会生效。 [wsl2] swap0 memory16GB后来在微软官方文档里看到&#xff0c;只有wsl2才支持通过.wslconfig文件配置&#xff0c;于是通过wsl -l -v查看当前wsl版本&#xff0c;…