457-Circular-Array-Loop
0x0 题目详情
0x1 解题思路
0x2 代码实现
class Solution {
public boolean circularArrayLoop(int[] nums) {
if(nums==null || nums.length==0){
return false;
}
int[] visited=new int[nums.length];
for(int i=0;i<nums.length;i++){
// Set<Integer> sets=new HashSet<>();
if(visited[i]==1){
continue;
}
int slow=i;
int fast=i;
boolean forward=nums[i]>=0;
do{
//这底下注释的代码是错误的,因为在本轮设置后,下一轮if条件必然成立,直接退出,提前终止了查询操作
// if(visited[slow]==1 || visited[fast]==1){
// break;
// }
//给我们遇到的元素打上标记,因为slow一定会一步一步遍历fast所遇到元素,所以我们设置一个就行了
visited[fast]=1;
slow=getNextIndex(nums,forward,slow);
fast=getNextIndex(nums,forward,fast);
if(fast!=-1){
//fast指针因为会多走一步,所以也需要打上标记
visited[fast]=1;
fast=getNextIndex(nums,forward,fast);
}
}while(slow!=-1 && fast!=-1 && fast!=slow);
//slow为-1,那么fast肯定为-1,反过来就不一定了,
//还是那句话,数组的快慢指针得一步一步走,不能像链表那样直接跳两步,数组得一步一步跳
if(slow!=-1 && fast==slow){
return true;
}
}
return false;
}
//forward为起点元素规定的方向,如果与当前元素的方向不一致,那么直接终止本轮的查找
//index为当前元素,我们返回的就是index之后要跳的索引位置
private int getNextIndex(int[] nums,boolean forward,int index){
boolean direction=nums[index]>=0;
if(direction!=forward){
return -1;
}
int nextIndex=(index+nums[index])%nums.length;
//处理负的步数
if(nextIndex<0){
nextIndex+=nums.length;
}
if(index==nextIndex){
nextIndex=-1;
}
return nextIndex;
}
}0x3 课后总结
Last updated