双指针主要分为快慢指针和左右指针两种。
快慢指针解决链表含环问题以及相差问题。
左右指针解决数组问题,左=0,右=length-1,二分查找等问题。
快慢指针
1.判断有无环:快指针一步走两个,慢指针一步一个,如果有环,最后指针会相遇;如果无环快指针先遇到null;
2.快慢指针可以寻找链表的中点(左右指针也可以)
3.相差问题,寻找链表的倒数第k个元素
快指针先走k步,然后快慢指针同时同速前进,当快指针遇到null时,慢指针到达倒数第k个节点。
Leetcode
左右指针
1.二分查找、有序的两数之和、反转数组
2.快速排序
private static int partition(int[] array, int left, int right) {
int key = array[left];
int index = left;
while (left < right) {
while (left < right && array[right] <= key) {
--right;
}
while (left < right && array[left] >= key) {
++left;
}
swap(array, left, right);
}
swap(array, right, index);
return right;
}
private static void swap(int[] cost, int i, int j) {
int temp = cost[i];
cost[i] = cost[j];
cost[j] = temp;
}