- 本专题我会和大家一起刷算法,尽可能给详细思路和算法代码~
0.原理讲解
- 常⻅的双指针有两种形式,⼀种是对撞指针,⼀种是快慢指针
1.对撞指针
- 对撞指针:⼀般⽤于顺序结构中,也称左右指针
- 对撞指针从两端向中间移动
- ⼀个指针从最左端开始
- 另⼀个从最右端开始
- 然后逐渐往中间逼近
- 对撞指针的终⽌条件:⼀般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环)
left == right
-> 两个指针指向同一个位置left > right
-> 两个指针错开
2.快慢指针
- 快慢指针:基本思想是使⽤两个移动速度不同的指针在数组或链表等序列结构上移动
- 其实不单单是环形链表或者是数组,如果研究的问题出现循环往复的情况时,均可考虑使⽤快慢指针的思想
- 快慢指针的实现⽅式有很多种,最常⽤的⼀种就是:
- 在⼀次循环中**,每次让慢的指针向后移动⼀位,⽽快的指针往后移动两位,实现⼀快⼀慢**
1.移动零
- 题目链接
cur = 0
:从左往右扫描数组,遍历数组dest = -1
:已处理的区间内,非零元素的最后一个位置
- 两个指针将数组划分为三个区域
-
[
0
,
d
e
s
t
]
[0, dest]
[0,dest] -> 非0
-
[
d
e
s
t
+
1
,
c
u
r
−
1
]
[dest + 1, cur - 1]
[dest+1,cur−1] -> 0
-
[
c
u
r
,
n
−
1
]
[cur, n - 1]
[cur,n−1] -> 待处理
- 实现思路:
cur
从前往后遍历过程中
- 遇到0元素:
cur++;
- 遇到非0元素
swap(dest + 1, cur);
dest++, cur++;
void MoveZeroes(vector<int>& nums)
{
for(int cur = 0, dest = -1; cur < nums.size(); cur++)
{
if(nums[cur])
{
swap(nums[++dest], nums[cur]);
}
}
}