应用题目:力扣457
什么是快慢指针
双指针法的一种,双指针除了有左右双指针外还有快慢双指针。
快慢指针是解决检测环问题的经典算法。
两个指针从同一个起点出发,快指针跑的更快,慢指针更慢。若是路径上存在环,那么快指针在进入环后会一直在环内打转,等待慢指针也进入后就能存在快指针追上慢指针的情况。若是路径上不存在环,那么快指针永远不会追上慢指针。
解题代码示例
class Solution {
private int[] nums;
private int n;
public boolean circularArrayLoop(int[] _nums) {
n = _nums.length;
nums = _nums;
for (int i = 0; i < n; i++) {
int slow = i,fast = next(i);
//保证同向查找,且不为0
while(nums[slow]*nums[next(slow)]>0 && nums[fast]*nums[next(fast)]>0){
if(slow==fast){
if(slow!=next(slow)){
return true;
}else{
break;
}
}
slow = next(slow);
fast = next(next(fast));
}
int flag = i;
//提高时间效率,把不可能的路径统统标记为0
while(nums[flag]*nums[next(flag)]>0){
int tmp = flag;
flag = next(flag);
nums[tmp] = 0;
}
}
return false;
}
int next(int k){
int res = (k+nums[k])%n;
return res>=0?res:n+res;
}
}
总结环问题解法
- 快慢指针:检测环存在
- 拓扑排序:检测环存在