优选算法——双指针专题2(模拟)

本期知识点导图:

1.上期参考代码

cpp 复制代码
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        for(int cur=0,dest=-1;cur<nums.size();cur++)
        if(nums[cur])//处理非零元素
        swap(nums[cur],nums[++dest]);//如果dest给0,这里要给后置++
    }
};

大家对代码有任何疑问欢迎在评论区留言或者私信我,期待大家的批评指正~

2.题目解析

点击这里跳转至本题

重点条件:

  • 数组长度固定
  • 复写零,其他元素往右退(会被挤出去)
  • 就地,不能用遍历然后复制的方法

3.解题思路

3.1异地

虽然题目已经说明不能使用异地操作,那说明异地操作理论是可行的,而且比较简单,就地操作没有思路,那我们先从异地操作中找找灵感。

3.1.1什么是异地操作

所谓异地操作,就是创建一个新的数组 来辅助复写零的操作。

就拿题给示例来说:

我们创建一个与原数组等长的辅助数组来存放复写的元素。

3.1.2逻辑

我们设置的两个指针:

crr:用来遍历原数组

dest:用来执行复写操作

执行逻辑:

遍历的过程中

  1. 判断:cur指向的元素是否为0
  2. 复写
  • 非零:复写一次
    1.dest将cur指向的元素复制到辅助数组中
    2.des++
    3.cur++
  • 零:复写两次
    1.dest将cur指向的元素复制到辅助数组中
    2.des++
    3.dest将cur指向的元素复制到辅助数组中
    4.des++
    5.cur++
    如图:

    这里大家注意dest指针最后所处的位置

3.2异地转就地

题中要求就地操作,于是我们尝试将异地的思路套到就地里来:

很显然行不通,直接从前往后进行本地复写操作,会造成后边的元素会覆盖,这样下去,后边的元素将全部变成0。

从前往后不行,那从后往前试试呢。这题是典型的一道半模拟题目,需要大家多画图,尝试找到最优解法~

3.3优解思路

3.3.1从后向前复写

还拿题给示例来说:

从后向前复写,肯定是从最后一个被复写元素来时遍历,如图。

这个思路显然是可行的~

到这里,本题的优解思路已经跃然纸上了,但是煮波在学习的过程中产生了两点疑问:

1:从后往前遍历的过程中,dest的复写位置不会超过前边的cur吗,然后和从前往后一样,元素被覆盖。

2:如何找到最后要复写的元素的位置?

下边就来解答这俩问题。

3.3.2 用双指针找到最后一个要复写的元素

  • 首先,在数组长度固定的情况下,dest的写入是一定不会超过cur的,因为我们在遍历之前已经确定好了起始位置,即从最后一个被复写的元素开始向前遍历。cur和dest的运动逻辑是已经被确定好了的,命中注定了的~

  • 其次我们将使用双指针算法来确定起始位置:

逻辑:

1.判断 cur指向元素是否为0

2.移动 dest,非零一位,零两位

3.判断 dest是否结束

4.cur- -

  • 为什么要从-1开始遍历?
    这就是为什么在前边强调要注意的dest的位置,我们沿用的是异地操作的逆逻辑,且从原始dest落尾位置 的前一个位置开始复写,那起始位置自然也要提前一个,从-1开始。

3.3.3处理边界情况

我们在用双指针找起始位置时,会有特殊情况:

最后一个元素时0,dest跑出界了

就像这样

这时就需要我们特殊处理一下了,单独给它一个处理的逻辑:

1.将n-1位置元素写成0

2.cur- -

3.dest- =2

然后接着之前的逻辑复写就好了~

参考代码在下篇博客,大家自己先实践一遍,再看答案,收获会更多 ~ ~

4.预告

下一期的题目是:
快乐数(点击跳转)

孩子们,下期见~

相关推荐
罗西的思考1 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
GlueNa2SiO32 小时前
第十八章 Linux故障排查与恢复
linux·服务器·笔记·学习
蛋先生DX2 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
weixin_431600442 小时前
NestJS 入门(3):Guard 如何挡住未登录请求?
前端·后端·学习·nest.js
带娃的IT创业者2 小时前
DeepTutor:当 Agent-Native 架构撞上个性化学习的临界点
学习·架构·ai agent·大模型应用·个性化学习·教育技术·agent-native架构
爱跳舞的烤冷面2 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号2 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
xian_wwq3 小时前
【学习笔记】Context Engineering,AI Agent 真正的内存管理-4/16
笔记·学习·context
月光船幽幽3 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI3 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研