(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.hqwc.cn/news/704250.html

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

相关文章

浅谈内存泄漏

内存泄漏 概念 在JavaScript中&#xff0c;内存泄漏是指应用程序在不再需要使用某块内存时仍然保持对其的引用&#xff0c;导致内存不能被垃圾回收机制释放&#xff0c;最终导致内存占用过高&#xff0c;性能下降。 内存泄漏通常发生在以下情况&#xff1a; 全局变量&#…

【补充】图神经网络前传——Node2vec

Node2Vec【图神经网络论文精读】_哔哩哔哩_bilibili 解决的问题&#xff1a;图嵌入 把每一个节点编码成一个d维的低维、稠密&#xff08;不是one-hot&#xff09;、连续&#xff08;不是离散的&#xff0c;是实数->有助于保存更多的信息&#xff09;向量&#xff0c;并且&a…

OpenHarmony标准设备应用开发(二)——布局、动画与音乐

本章是 OpenHarmony 标准设备应用开发的第二篇文章。我们通过知识体系新开发的几个基于 OpenHarmony3.1 Beta 标准系统的样例&#xff1a;分布式音乐播放、传炸弹、购物车等样例&#xff0c;分别介绍下音乐播放、显示动画、动画转场&#xff08;页面间转场&#xff09;三个进阶…

我与C++的爱恋:string类的常见接口函数

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 朋友们大家好啊&#xff0c;本节我们来到STL内容的第一部分&#xff1a;string类接口函数的介绍 ​ ​ 1.string类的认识 给大家分享一个c文档 https://legacy.cplusplus.…

【C语言每日题解】用函数来模拟实现strlen()、strcpy()、strcmp()、strcat()

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ 学习了函数后&#xff0c;老师让我们用函数来实现上面这四个字符串函数。 我们首先来了解一下这四个字符串函数&#xff1a; 1.strlen函数 用于获取字符串长度&#xff08;不包括末尾…

【Linux 网络】网络基础(二)(应用层协议:HTTP、HTTPS)-- 详解

我们程序员写的一个个解决我们实际问题&#xff0c;满足我们日常需求的网络程序&#xff0c;都是在应用层。 前面写的套接字接口都是传输层经过对 UDP 和 TCP 数据发送能力的包装&#xff0c;以文件的形式呈现给我们&#xff0c;让我们可以进行应用层编程。换而言之&#xff0c…

测试之路 - 精准而优雅

引子 这几年业内一直在做精准测试&#xff0c;大都使用工具 diff 代码改动、分析代码覆盖率这些平台集成的能力。 业务测试中&#xff0c;我们在技术设计和代码实现的基础上也做了一些精减和精准的测试实践&#xff0c;通过深入测试有针对的设计 case&#xff0c;发现隐藏问题…

RALL-E: Robust Codec Language Modeling with Chain-of-Thought Prompting for TTS

demo pageDetai Xin&#xff0c; tanxu微软 & 东大 & 浙大 abstract 使用CoT的思路&#xff0c;和Valle的框架&#xff0c;先实现LLM预测音素级别pitch/duration&#xff0c;然后预测speech token。 methods Prosody tokens as chain-of-thought prompts 和Valle一…

uac驱动之const修饰的变量和const修饰的指针

const int*p // p所指向的空间是常量 不可修改 ,但p可以修改 int*const p // p所指向的空间是可以修改 ,p不可以修改 #include <stdio.h> #include <string.h>struct usb_string {char id;const char *s; };enum {STR_ASSOC,STR_AC_IF,STR_USB_OUT_IT,STR_USB_O…

20232803 2023-2024-2 《网络攻防实践》实践九报告

目录 1.实践内容2.实践过程2.1 手工修改可执行文件&#xff0c;改变程序执行流程&#xff0c;直接跳转到getShell函数2.2 利用foo函数的Bof漏洞&#xff0c;构造一个攻击输入字符串&#xff0c;覆盖返回地址&#xff0c;触发getShell函数2.3 注入一个自己制作的shellcode并运行…

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

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

VMware17虚拟机安装Kali Linux2024详解

目录 简介 一、环境搭建 二、下载ISO镜像 三、新建虚拟机 为虚拟机选择合适的操作系统类型和版本 分配适当的内存、硬盘空间和其他虚拟机配置选项 四、硬件配置 编辑虚拟机设置 选择安装介质 五、界面化安装配置 简介 Kali Linux是一个基于Debian的Linux发行版&#…