양의 정수 값과 음의 정수 값으로 구성된 원형 배열 num이 있다고 가정합니다. 인덱스에 있는 숫자 k가 양수이면 k 단계 앞으로 이동합니다. 그렇지 않고 음수(-k)이면 k 단계 뒤로 이동합니다. 배열은 원형이므로 마지막 요소의 다음 요소가 첫 번째 요소이고 첫 번째 요소의 이전 요소가 마지막 요소라고 가정할 수 있습니다. 숫자에 루프(또는 순환)가 있는지 확인해야 합니다. 사이클은 동일한 인덱스에서 시작하고 끝나야 하고 사이클의 길이> 1입니다. 따라서 입력이 [2,-1,1,2,2]와 같으면 인덱스에서 사이클이 있으므로 출력은 true가 됩니다. 0 -> 2 -> 3 -> 길이 3의 0.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
n :=숫자 크기
-
n <2이면 false를 반환합니다.
-
0 ~ n - 1 범위의 i에 대해 nums[i] :=nums[i] mod n
-
0 ~ n – 1 범위의 i에 대해
-
nums[i] =0이면 다음 반복으로 이동합니다.
-
느린 =나, 빠른 =나;
-
nums[slow] * nums[fast]> 0 및 nums[next of fast] * nums[slow]> 0
-
느린 =느린 다음
-
fast :=fast 다음의 다음
-
느린 =빠른 경우
-
느린 경우 =다음 느린 경우 루프에서 나옵니다.
-
true를 반환
-
-
-
x :=숫자[i]
-
느린 :=나는
-
동안 숫자[느림] * x> 0
-
temp :=다음으로 느림
-
느린 다음 :=0
-
느림 :=온도
-
-
-
거짓 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h> using namespace std; class Solution { public: int next(vector<int>& nums, int i){ int n = nums.size(); return (n+nums[i]+i)%n; } bool circularArrayLoop(vector<int>& nums) { int n = nums.size(); if(n < 2) return false; for(int i = 0; i < n; i++)nums[i] %= n; for(int i = 0; i < n; i++){ if(nums[i] == 0) continue; int slow = i; int fast = i; while(nums[slow] * nums[fast] > 0 && nums[next(nums, fast)] * nums[slow] > 0){ slow = next(nums, slow); fast = next(nums, next(nums, fast)); if(slow == fast){ if(slow == next(nums, slow)) break; return true; } } int x = nums[i]; slow = i; while(nums[slow] * x > 0){ int temp = next(nums, slow); nums[slow] = 0; slow = temp; } } return false; } }; main(){ vector<int> v = {2,-1,1,2,2}; Solution ob; cout << (ob.circularArrayLoop(v)); }
입력
[2,-1,1,2,2]
출력
1