题目链接: Leetcode 457. Circular Array Loop
第一次遇到用 slow/fast 指针来解决存在循环网络的问题,新奇。
心得:既然是写代码,机器处理数据,应该尽量从机器的角度去思考,而非以人的角度去思考:如果人自己解决它,那要机器干什么呢:)
public class Solution {
public boolean circularArrayLoop(int[] nums) {
int n = nums.length;
for(int i=0;i<n;i++){
if(nums[i]==0){
continue;
}
// slow fast pointers
int j=i, k=getNext(j,nums);
while(nums[i]*nums[j]>0&&nums[i]*nums[k]>0&&nums[i]*nums[getNext(k,nums)]>0){
if(j==k){
//check for one element between loop
if(j==getNext(j,nums)){
break;
}
return true;
}
j = getNext(j,nums);
k = getNext(getNext(k,nums),nums);
}
// clean all the loop along the way
j = i;
int val = nums[i];
while(nums[j]*nums[i]>0){
nums[j] = 0;
j = getNext(j,nums);
}
}
return false;
}
private int getNext(int j, int[] nums) {
// TODO Auto-generated method stub
int n = nums.length;
return j+nums[j]>0?(j+nums[j])%n:n+((j+nums[j])%n);
}
}