创建于:20170308
原文链接:https://leetcode.com/articles/two-pointer-technique/
1 双指针分两种:
- 一个慢指针,一个快指针
- 一个头指针,一个尾指针
2 一个字符串翻转的例子
2.1 直接方法
public void reverse(char[] str) {
int n = str.length;
for (int i = 0; i < n / 2; i++) {
swap(str, i, n - i - 1);
}
}
该方法,从头开始交换,但需要考虑中间位置n/2。如果没有理解清楚,跑过了,则会得到错误的结果。
为什么n/2,恰好就是正确的呢?无论是奇数长度还是偶数长度。拿个实际例子测一下:
0 1 2 3 4 #长度为5,是奇数列。5/2下取整=2,恰好是中间下标。因此n/2位置不需要进行swap
0 1 2 3 #长度为4,是偶数列。4/2下取整=2,恰好是后一半的起点。因此n/2位置不需要进行swap
因此也可以记住这个结论,当然记不住也没关系,像上面这样“推导”一下也就知道了。
2.2 双指针方法
public void reverse(char[] str) {
int i = 0, j = str.length - 1;
while (i < j) {
swap(str, i, j);
i++;
j--;
}
}
i是头指针0
j是尾指针len-1
如果数组n是奇数,则