优选算法——双指针1(数组分块)

本题知识点导图:

1.题目解析

题目链接(点击跳转)

重要条件:

  • 0移到末尾
  • 原相对顺序不得改变
  • 不得复制数组(本地操作)

本题是典型的数组分块题型,数组分块的意思就是根据不同要求,将数组分成多个不同区间,每个区域通过不断维护,保持一定的特征。
看到这类问题第一反应就是使用双指针算法,双指针的"指针"指的是数组下标,下标能告诉我们数据存在数组的哪个位置,作用类似于指针告诉我们变量存在内存空间的什么地方,故称为双指针。
首次接触这类问题,没有思路很正常,但是下次碰到这种问题,就要想到,使用双指针。

2优解思路

  • 根据题意,首先我们把数组分成两个块:已处理和未处理
  • 已处理的部分,我们又能将它分成非0和0两个块
  • 非0的块还要保持原来的相对顺序

确定好分成三个块之后,我们的代码要实现的功能就是把未处理的那部分内容按照要求分别放到已经处理好的两个块中即可。

2.1定义双指针

定义双指针,将数组分块

上图是算法执行过程中的分组状态**,dest初始值是-1,cur初始值是0**,意思是刚开始,还没有元素被处理过,两个已处理的区间都不存在,大家把dest写成0,那就是已处理非0区间长度为0,已处理0区间不存在,也可以的,不过后续遍历时的操作可能略有不同,思路都是一样的。

2.2遍历逻辑

cur从第一个元素开始往后遍历,遇到0,直接略过,遇到非0,让dest先自增1,再将cur和dest指向的元素互换,cur自增1继续遍历。当cur遍历完数组后,自然只剩下被处理好的两个块:非零(相对顺序未改变)和0了。


来到元素1的位置之后,cur指向的元素非0,执行下边三行代码的逻辑,执行完之后cur来到了3的位置,非0,继续执行该逻辑

重复上述逻辑,直至cur遍历结束

最后只剩下两个数组块区间,且符合要求
参考代码在下篇博客,大家自己先实践一遍,再看答案,收获会更多 ~ ~

预告

下一期的题目为
复写零(点击跳转)
各位,明天见~

相关推荐
NAGNIP2 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
端平入洛9 小时前
delete又未完全delete
c++
颜酱10 小时前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub14 小时前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub14 小时前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub14 小时前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub14 小时前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub14 小时前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
NAGNIP1 天前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试
NAGNIP1 天前
一文搞懂激活函数!
算法·面试