知识点导图

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 了。






