快慢双指针算法--数组删除目标元素--LeetCode27

储备知识

数组,赋值操作,指针

题目

给你一个数组 nums和一个值 val,你需要 原地 移除所有数值等于 val的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k。

思路

本题我们使用同向双指针方法可以高效解决

首先我们要知道,删除的本质还是覆盖,把数组中一个数值3赋值成4,那么3就被删除了。

所以我们只需要把目标值val的下一个数值赋值给val的位置,就达到了删除val保留其他数的目的

思路如下

一开始,两个指针都站在数组的第一个位置(下标 0)。

侦察兵(快指针fast)先走,每到一个新格子,他就判断:

如果这个格子里的东西正好是我们要删掉的 val,那侦察兵就自己记住,不告诉整理员(慢指针slow),直接跳过,继续往前走。

如果格子里的东西是我们需要保留的(不等于 val),侦察兵就把这个需要保留的数直接赋值到slow的那个位置。

整理员(慢指针)听到后,就把这个好东西拿过来,放到自己当前指向的位置,然后自己往前进一步(slow++),准备接收下一个需要的数。

侦察兵一直走到数组的尽头,整理员也就把所有的需要的数都按顺序堆在了数组的前面。

最后,整理员站的位置(slow)就是删除val后数组的长度。

代码实现

cpp 复制代码
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {  
        if (nums.empty()) {
            return 0;     //先判空,判断数组是否为空
        }
//定义快慢指针,这里的fast定义与后面for循环里重复,建议删除,这里这样写是为了看起来结构易懂
        int slow = 0;
        int fast =0;
//开始遍历数组
        for (int fast=0; fast < nums.size(); fast++) {
            //注意if条件
                if (nums[fast] != val) {
                nums[slow] = nums[fast];
                slow++;
            }
        }
        return slow;//题目要求的是返回数组长度,此时slow的位置就是长度
    }               //注意不是返回nums[slow]那将返回最末尾的那个数值
};

总结

双指针的方法在解决数组问题中非常好用,此题使用了快慢双指针的思想(同向双指针),重点体会和理解以下几点

1.循环每一轮是如何进行的,两个指针是如何前进的

2.if条件句里的!=

相关推荐
Pniubi3 分钟前
快速排序(力扣基础)(递归)
java·数据结构·算法
xiaoye-duck15 分钟前
《C++ 项目:手写大模型接入 SDK》Trae IDE 开发环境搭建与依赖管理
c++·ide·语言模型
H.莓飛20 分钟前
【Linux】自主 Shell
linux·运维·服务器·c语言·开发语言·visual studio
roman_日积跬步-终至千里20 分钟前
【数据Agent论文·分析与报告评测|27】ComInsight:原子洞察正确,组合后的结论就可靠吗?
人工智能·算法·机器学习·数据分析
熊猫钓鱼>_>23 分钟前
Kotlin Multiplatform for OpenHarmony 实战:kotlinx-coroutines 结构化并发适配
开发语言·kotlin·agent·harmonyos·openharmony·适配·华为云码道
沫璃染墨35 分钟前
《Qt从零入门系列(十四):QThread多线程详解——从线程创建到客户端阻塞处理》
开发语言·c++·笔记·qt·ui·交互·线程
草莓熊Lotso37 分钟前
【C++ 基于微服务的即时通讯系统】Elasticsearch 从安装到 C++ 客户端二次封装全落地
linux·网络·数据库·c++·elasticsearch·微服务
Samson Bruce37 分钟前
【数学之美】
线性代数·算法·概率论
hixiong1231 小时前
C# 使用 ZXingCpp.Angle 进行条码、二维码识别
开发语言·c#·扫码
CHPCWWHSU1 小时前
FreeCAD 源码解读:从 Property 到 Command,看一套 CAD 内核的完整闭环
c++·cad