287. 중복 번호 찾기 🚀
솔루션 개발:
질문
이 기사에서는 Leetcode의 '287. Find the Duplicate Number' 질문을 다룰 것입니다. Google 없이는 일정한 공간에서 절대 풀지 못할 질문(또는 알지 못함floyd's turtle and hare )
의문:
Given an array of integers nums containing n + 1 integers where each integer is in the range [1, n] inclusive.
There is only one repeated number in nums, return this repeated number.
You must solve the problem without modifying the array nums and uses only constant extra space.
Input: nums = [1,3,4,2,2]
Output: 2
질문 설명
이 질문의 등급은 보통입니다. 특히 141. Linked List Cycle 또는 142. Linked List Cycle 을 해결한 적이 없는 경우 정확하지 않습니다. Robert W. Floyd 자신이 아니라면 이 두 가지 문제를 모두 해결하는 방법을 모르면 해결이 불가능하다고 말할 수 있습니다.
그렇다면 이 질문을 실제로 어떻게 해결할 수 있을까요? floyd's turtle and hare은 이 질문을 제가 이해하는 유일한 방법입니다.
알겠습니다. Turtle & Hare 접근 방식으로 해결할 수 있습니다. 하지만 당신이 묻는 게 도대체 뭐죠?
Floyds Turtle & Hare는 루프백하는 노드를 찾기 위해 설계된 알고리즘입니다. 즉, 목록에서 주기를 감지합니다. 일반적으로 Linked List에서 이 작업을 수행하지만 이번에는 배열로 위장한 Linked List가 있습니다. 여기서 nums[i]는 다음 노드를 나타냅니다.
어떻게 작동합니까?
그 배후의 수학은 복잡합니다. 직접 확인하십시오: Proof ;
;
기본적으로 한 번에 하나의 포인터를 1노드씩 이동하고(느리게) 또 다른 포인터를 두 배의 속도로 이동하는 경우(빠름), 우리의 빠른 속도는 결국 주위를 맴돌다가 느리게 착륙할 것입니다. 즉, 속도 차이로 인해 만날 수 없어 루프가 발생했습니다. 따라서 우리는 빠른 포인터를 다시 시작점으로 이동하고 포인터가 다시 만날 때까지 한 번에 1노드씩 이동합니다. 그들이 다시 만날 때도 마찬가지입니다. 그들은 항상 루핑 노드에서 만날 것입니다.
이를 달성하기 위한 코드는 매우 간단합니다.
빅오 표기법:
리트코드 결과:
제출 링크 참조:
해결책
var findDuplicate = function(nums) {
let slow = 0;
let fast = 0;
do {
slow = nums[slow];
fast = nums[nums[fast]];
} while (slow != fast);
fast = 0;
do {
slow = nums[slow];
fast = nums[fast];
} while (slow != fast);
return slow
};
Reference
이 문제에 관하여(287. 중복 번호 찾기 🚀), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/samuelhinchliffe/287-find-the-duplicate-number-3d4e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
var findDuplicate = function(nums) {
let slow = 0;
let fast = 0;
do {
slow = nums[slow];
fast = nums[nums[fast]];
} while (slow != fast);
fast = 0;
do {
slow = nums[slow];
fast = nums[fast];
} while (slow != fast);
return slow
};
Reference
이 문제에 관하여(287. 중복 번호 찾기 🚀), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/samuelhinchliffe/287-find-the-duplicate-number-3d4e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)