双指针算法简介
双指针常见的用法主要有两类:对撞指针和快慢指针。前者更适合顺序结构里的区间收缩,后者更像是在同一条路径上做'探路'和'落位'。
1. 对撞指针:通常用于有序数组这类顺序结构,也常被叫作左右指针。
- 两个指针从两端往中间走,一个从左边开始,另一个从右边开始。
- 终止条件一般是
left == right或left > right;有些题会在中途直接得到答案,就不用等到指针相遇。
2. 快慢指针:也叫龟兔赛跑。两个指针在同一序列上移动,但速度不同,常见的是慢指针每次走一步,快指针每次走两步。
这种写法在链表、数组里都很常见,尤其是处理'会不会绕回来'这类问题时,快慢指针往往比别的办法更直接。它不花哨,但够稳。
1. 移动零(Easy)
题目链接:移动零

思路
这题适合用一个扫描指针 cur,再配一个记录非零区末尾的 dest。cur 负责一路往前看,dest 只管把非零元素放到应该在的位置。这样做的好处是,数组只扫一遍,逻辑也比较干净。

class Solution {
public:
void moveZeroes(vector<int>& nums) {
for (int cur = 0, dest = -1; cur < nums.size(); ++cur) {
if (nums[cur] != 0) {
++dest;
swap(nums[dest], nums[cur]);
}
}
}
};
这里不用特地把 0 挪来挪去。只要遇到非零元素,就把它和 dest + 1 交换,前面的非零区会慢慢长大,剩下的位置自然就是 0。写法短,空间也是原地完成,线上刷题时挺省事。
2. 复写零(Easy)
题目链接:




