(1)双指针算法介绍与练习:移动零

目录

双指针算法介绍

练习:移动零


双指针算法介绍

双指针算法常见于数组和双向链表的题型

在数组中,双指针中的指针代表数组元素的下标,而不是真正的指针类型变量

在双向链表中,双指针中的指针即为真正意义上的指针,该指针一般是双向链表节点类型的指针

常见的双指针有两种形式:

  1. 对撞指针:从结构的两端开始向中间移动,一般存在两种情况
    1. left == right:代表两个指针指向的时同一个位置
    2. left > right:代表连个指针已经相遇过一次,相遇的下一次形成交错
  2. 快慢指针:所谓快慢指针即为一个指针走得快,一个指针走得慢
    1. 快慢指针一般的思路是:慢指针走一步,快指针走两步

练习:移动零

题目链接:283. 移动零 - 力扣(LeetCode)

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。

思路解析:

本题可以采用双指针算法进行解决,定义一个指针cur和dest,通过这两个指针构建出三个区间,分别是:

  1. [0, dest] 代表已处理区间中的非0部分
  2. [dest+1, cur-1] 代表已处理的区间中的0
  3. [cur, nums.size()-1] 代表未处理的区间

当每一次的遍历移动数据后形成的区间满足上面三个区间的内容,则代表最后结果正确,如图所示:

此时的区间[0, dest]为不存在的区间,所以不存在非0部分,而[dest+1, cur-1]也为不存在区间,[cur, nums.size()-1]区间中有一个未处理数据0

操作的基本思路为:

  1. 当遇到0时:dest不动,cur向前走一步
  2. 当遇到非0时:dest向前走一步,交换dest的数据和cur的数据
  3. 交换完毕后:cur向前走一步

在上面的区间中[0, dest]区间中有一个数字1,[dest+1, cur - 1]区间中存在一个数字0,[cur, nums.size()-1]区间中均为未处理的数据

在上面的区间中[0, dest]区间中有数字1和3,[dest+1, cur - 1]区间中存在两个数字0,[cur, nums.size()-1]区间中均为未处理的数据

在上面的区间中[0, dest]区间中有数字1、3和12,[dest+1, cur - 1]区间中存在连个数字0,[cur, nums.size()-1]区间不存在,此时数组已经遍历交换完成,所有的数字零移到了数组的末尾,并且没有改变数组非0元素的相对位置

参考代码:

/** @lc app=leetcode.cn id=283 lang=cpp** [283] 移动零*/// @lc code=start
class Solution
{
public:void moveZeroes(vector<int> &nums){// 记录已处理的区间中最后一个非零元素的位置int dest = -1;// 遍历数组int cur = 0;while (cur < nums.size()){// 遇到0不交换if (nums[cur] == 0){cur++;}else{// 遇到非0元素交换dest下一个位置的数据和cur位置的数据swap(nums[++dest], nums[cur++]);}}}
};
// @lc code=end

或者写成下面的形式:

/** @lc app=leetcode.cn id=283 lang=cpp** [283] 移动零*/// @lc code=start
class Solution
{
public:void moveZeroes(vector<int> &nums){for (int cur = 0, dest = -1; cur < nums.size(); cur++){if (nums[cur]){swap(nums[++dest], nums[cur]);}}}
};
// @lc code=end

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

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

相关文章

【RAG 去噪】引入 NLI 模型来为 RAG 去噪

论文&#xff1a;Making Retrieval-Augmented Language Models Robust to Irrelevant Context ⭐⭐⭐ ICLR 2024, arXiv:2310.01558 Code: github.com/oriyor/ret-robust 论文速读 这篇论文引入 NLI&#xff08;Natural Language Inference&#xff09;模型来判定 retrieved d…

CCF PTA 2022年11月C++学生会提名

【问题描述】 学生会选举要开始了。根据选举规则&#xff0c;首先由全体同学进行提名&#xff0c;每位同学可以从全体同学中提 名一名同学参选。选举时&#xff0c;会从全体同学的提名中选出一名学生会主席&#xff0c;再从三个年级分别的提名中 各选出一名副主席。现在&#…

【数据结构】堆(超详细)

文章目录 前言堆的概念及结构堆的实现堆的向下调整算法&#xff08;建小堆为例&#xff09;堆的向上调整算法&#xff08;建小堆为例&#xff09;堆的初始化销毁堆堆的插入堆的删除(规定删堆顶的数据)取堆顶元素判断堆是否为空获取堆的个数 完整代码&#xff08;包括测试代码&a…

惠普发布全新AI战略,重塑办公空间 引领企业智能化新浪潮

近日、全球知名科技公司惠普在北京隆重举办了以“用智能&#xff0c;开启无限可能”为主题的2024惠普商用AI战略暨AI PC新品发布会&#xff0c;此次盛会标志着惠普在人工智能领域迈出了重要一步&#xff0c;惠普紧跟时代步伐&#xff0c;推出了更高效、更安全、更灵活的AI PC产…

大佬复活,暴打空头,两天拉升 180%

GME 暴打空头 大家还记得 2021 年&#xff0c;美国散户大战华尔街的新闻吗&#xff1f; 当时在推特上&#xff0c;几位大佬进行号召&#xff0c;吸引了大量散户往里冲&#xff0c;短短一个月&#xff0c;把一家业绩平平的美股公司「游戏驿站&#xff08;GME&#xff09;」拉升了…

怎么3d立面有些模型不能删除是什么原因怎么解决?---模大狮模型网

在进行3D建模和设计过程中&#xff0c;有时会遇到一些模型无法删除的情况&#xff0c;这可能会导致设计流程受阻&#xff0c;影响工作效率。本文将介绍在3D立面中遇到无法删除模型的原因以及解决方法&#xff0c;帮助您顺利解决这一问题&#xff0c;提高设计效率。 一、模型未正…

地平线X3开发板配置wifi调试

1. 系统镜像制作 系统镜像的制作依赖bsp与补丁包&#xff0c;bsp在天工开物全量包中&#xff1a;https://developer.horizon.ai/resource 补丁下载链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1YKcOWL0EpboGq-SnqwIGeQ 提取码&#xff1a;b6lf 补丁包中有详细…

golang实现普通升管理员权限

golang实现普通升管理员权限 package mainimport ("fmt""os""path/filepath""runtime""syscall""unsafe""golang.org/x/sys/windows""golang.org/x/sys/windows/registry" )var (modntdll …

认识数据库,及 MySQL数据库的基本使用

数据库 1.1 数据库的基本概念 1.2 常见的数据库及分类 市面上的数据库有很多种&#xff0c;最常见的数据库有如下几个&#xff1a; MySQL 数据库&#xff08;目前使用最广泛、流行度最高的开源免费数据库&#xff1b;Community Enterprise&#xff09; Oracle 数据库&…

这 10 个 Linux 命令,我不允许你还不知道!

Linux当中有很多比较有趣的命令&#xff0c;可以动手看看&#xff0c;很简单的。 1.rev命令 一行接一行地颠倒所输入的字符串。 运行&#xff1a; $rev 如输入&#xff1a;shiyanlou shiyanlou 2.asciiview命令 1.先安装aview $sudo apt-get install aview 2.再安装im…

【吃透Java手写】6-Netty-NIO-BIO-简易版

Netty 1 BIO&NIO模型 1.1 BIO 在JDK1.4出来之前&#xff0c;我们建立网络连接的时候采用BIO模式&#xff0c;需要先在服务端启动一个ServerSocket&#xff0c;然后在客户端启动Socket来对服务端进行通信&#xff0c;默认情况下服务端需要对每个请求建立一堆线程等待请求&…

TikTok Shop认知课 打通TK小店全流程

资料 001-先导课.mp4 002-如何用思维导图工具做课程笔记.mp4 003-TTS入驻模式.mp4 004-如何获取店铺.mp4 005-TTS店铺注册全流程,mp4 006-店铺整体运营思路.mp4 007-运营的几个误区.mp4 008-新店起店准备工作,mp4 009-规店铺风控注意事项,mp4 010-店铺基础设置之店铺…

基于火山引擎云搜索的混合搜索实战

在搜索应用中&#xff0c;传统的 Keyword Search 一直是主要的搜索方法&#xff0c;它适合精确匹配查询的场景&#xff0c;能够提供低延迟和良好的结果可解释性&#xff0c;但是 Keyword Search 并没有考虑上下文信息&#xff0c;可能产生不相关的结果。最近几年&#xff0c;基…

单文件组件,为什么要使用 SFC

介绍 Vue 的单文件组件 (即 *.vue 文件&#xff0c;英文 Single-File Component&#xff0c;简称 SFC) 是一种特殊的文件格式&#xff0c;使我们能够将一个 Vue 组件的模板、逻辑与样式封装在单个文件中。下面是一个单文件组件的示例&#xff1a; <script setup> impor…

机器学习_朴素贝叶斯

机器学习_朴素贝叶斯 朴素贝叶斯算法&#xff08;Naive Bayes Algorithm&#xff09;是一种基于贝叶斯定理与特征条件独立假设的分类方法。该算法假设给定目标值时&#xff0c;各个特征之间相互独立。朴素贝叶斯算法通过训练数据集学习联合概率分布&#xff0c;并基于此模型&a…

优秀博士学位论文分享:复杂场景下高精度有向目标检测的研究

优秀博士学位论文代表了各学科领域博士研究生研究成果的最高水平&#xff0c;本公众号近期将推出“优秀博士学位论文分享”系列文章&#xff0c;对人工智能领域2023年优秀博士学位论文进行介绍和分享&#xff0c;方便广大读者了解人工智能领域最前沿的研究进展。 “博士学位论…

C++11 新特性 常量表达式 constexpr

为了解决常量无法确定的问题&#xff0c;C11在新标准中提出了关键字constexpr&#xff0c;它能够有效地定义常量表达式&#xff0c;并且达到类型安全、可移植、方便库和嵌入式系统开发的目的。 一、常量的不确定性 在C11标准以前&#xff0c;我们没有一种方法能够有效地要求一…

UBUNTU下CMAKE指定执行文件运行时查找库的路径

在Ubuntu下&#xff0c;使用CMake时&#xff0c;如果需要指定执行文件运行时库的搜索路径&#xff0c;可以在CMakeLists.txt文件中通过set_target_properties命令来设置。 以下是一个示例&#xff0c;假设你的目标是一个名为my_application的可执行文件&#xff0c;你想要添加…

LLama3大模型本地部署 仅需6步完成对话模型本地安装部署。附送可视化ui安装、自定义模型目录,修改模型保存地址,第三方微调模型、中文模型下载地址

本篇分为三部分 一&#xff1a;6步完成llama3大模型本地部署 二&#xff1a;8步完成llama3可视化对话界面安装 三&#xff1a;重设模型文件路径 四&#xff1a;微调模型、中文模型下载资源分享 一、LLama3 大模型本地部署安装 首先去mata官网下载ollama客户端 Ollama 选择合适…

如何使用正则表达式避免生成空字符串

在字符串处理中&#xff0c;我们经常需要将字符串根据特定的分隔符拆分成多个子字符串。Java 中的 split 方法可以很好地完成这项任务。但是&#xff0c;在使用 split 方法时&#xff0c;如果分隔符连续出现&#xff0c;可能会生成空字符串。 可以使用正则表达式避免生成空字符…