一.快慢指针基本
1.基本样式
基本格式
fast=getNext(n);
slow=n;
while(fast!=slow){
slow=getNext(slow);
fast=getNext(getNext(fast);
}
二.快慢指针的应用
1.利用快慢指针检测环
例题1--202. 快乐数,编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
- 若循环,必定存在环
int getNum(int n){
int ans=0;
while(n>0){
ans+=(n%10)*(n%10);
n=n/10;
}
return ans;
}
bool isHappy(int n) {
int fastNum=getNum(n);
int slowNum=n;
while(fastNum!=1&&fastNum!=slowNum){
fastNum=getNum(getNum(fastNum));
slowNum=getNum(slowNum);
}
return fastNum==1;
}
例题2--287. 寻找重复数,给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
- 抽屉原理:把多于n+1个的物体放到n个抽屉里,则至少有一个抽屉里的东西不少于两件。
- 以当前数组元素的值,为下一个数组元素的下标,构建链表
int findDuplicate(vector<int>& nums) {
int slow=0,fast=0;
do{
slow=nums[slow];
fast=nums[nums[fast]];
}while(slow!=fast);
slow=0;
while(slow!=fast){
slow=nums[slow];
fast=nums[fast];
}
return slow;
}