먼저 시프트 상수 k를 찾아야합니다. 이것은 O (lgN) 시간에 수행 될 수 있습니다. 상수 시프트 k에서 상수 k와 함께 이진 검색을 사용하여 원하는 요소를 쉽게 찾을 수 있습니다. 증강 이진 검색에도 O (lgN) 시간이 걸립니다. 총 실행 시간은 O (lgN + lgN) = O (lgN)입니다.
상수 이동을 구하려면 k. 배열에서 최소값을 찾아야합니다. 배열의 최소값 인덱스는 상수 이동을 알려줍니다. 정렬 된 배열 [1,2,3,4,5]를 고려하십시오.
가능한 이동은 다음과 같습니다.
[1,2,3,4,5] // k = 0
[5,1,2,3,4] // k = 1
[4,5,1,2,3] // k = 2
[3,4,5,1,2] // k = 3
[2,3,4,5,1] // k = 4
[1,2,3,4,5] // k = 5 % 5 = 0
O (lgN) 시간에 알고리즘을 수행하려면 항상 문제를 절반으로 나누는 방법을 찾는 것이 중요합니다. 이렇게하면 나머지 구현 세부 사항은 간단합니다.
다음은 알고리즘에 대한 C ++ 코드입니다.
#include <vector>
#include <iostream>
using namespace std;
int binarySearchFindK(vector<int>& nums, int begin, int end)
{
int mid = ((end + begin)/2);
if((mid > begin && nums[mid] < nums[mid-1]) || (mid == begin && nums[mid] <= nums[end]))
return mid;
if (nums[mid] > nums[end])
{
begin = mid+1;
return binarySearchFindK(nums, begin, end);
}
else
{
end = mid -1;
return binarySearchFindK(nums, begin, end);
}
}
int getPivot(vector<int>& nums)
{
if( nums.size() == 0) return -1;
int result = binarySearchFindK(nums, 0, nums.size()-1);
return result;
}
int binarySearchSearch(vector<int>& nums, int begin, int end, int target, int pivot)
{
if (begin > end) return -1;
int mid = (begin+end)/2;
int n = nums.size();
if (n <= 0) return -1;
while(begin <= end)
{
mid = (begin+end)/2;
int midFix = (mid+pivot) % n;
if(nums[midFix] == target)
{
return midFix;
}
else if (nums[midFix] < target)
{
begin = mid+1;
}
else
{
end = mid - 1;
}
}
return -1;
}
int search(vector<int>& nums, int target) {
int pivot = getPivot(nums);
int begin = 0;
int end = nums.size() - 1;
int result = binarySearchSearch(nums, begin, end, target, pivot);
return result;
}
이것이 도움이되기를 바랍니다! =)
Soon Chee Loong,
토론토 대학교
homework
태그 를 추가 해주세요 . 그러면 사람들이 붙여 넣을 수있는 답변을 게시하는 대신 올바른 방향으로 부드럽게 넛지하도록 유도 할 수 있습니다.