[고전 면접 문제] 정렬 된 배열 의 회전 을 입력 하고 회전 배열 의 최소 요 소 를 출력 합 니 다.
한 배열 의 맨 처음 몇 개의 요 소 를 배열 의 끝 에 옮 기 는 것 을 우 리 는 배열 의 회전 이 라 고 부른다.정렬 된 배열 의 회전 을 입력 하고 회전 배열 의 최소 요 소 를 출력 합 니 다.예 를 들 어 배열 {3, 4, 5, 1, 2} 은 {1, 2, 3, 4, 5} 의 회전 이 고 이 배열 의 최소 값 은 1 이다.
[분석]
이 문제 의 가장 직관 적 인 해법 은 결코 어렵 지 않다.처음부터 끝까지 배열 을 한 번 훑 어보 면 가장 작은 요 소 를 찾 을 수 있 고 시간 복잡 도 는 분명히 O (N) 이다.그러나 이 사 고 는 입력 배열 의 특성 을 이용 하지 않 았 기 때문에 우 리 는 더 좋 은 해법 을 찾 을 수 있 을 것 이다.
우 리 는 회전 한 후의 배열 이 실제 적 으로 두 개의 정렬 된 하위 배열 로 나 눌 수 있 고 앞의 하위 배열 의 요 소 는 모두 뒷 면 배열 의 요소 보다 크 거나 같다 는 것 을 알 게 되 었 다.우 리 는 또한 가장 작은 원소 가 바로 이 두 개의 하위 그룹의 경계선 이라는 것 을 알 수 있다.우 리 는 이원 탐색 법의 사고방식 으로 이 가장 작은 원 소 를 찾 으 려 고 한다.
우 리 는 배열 중간 에 있 는 요 소 를 얻 었 다.이 중간 요소 가 앞의 증가 서브 배열 에 있다 면 첫 번 째 포인터 가 가리 키 는 요소 보다 크 거나 같 아야 합 니 다.이 때 배열 에서 가장 작은 요 소 는 이 중간 요소 의 뒤에 있어 야 합 니 다.우 리 는 첫 번 째 지침 을 이 중간 요 소 를 가리 키 면 찾 는 범 위 를 좁 힐 수 있다.마찬가지 로 중간 요소 가 뒤의 증가 서브 배열 에 있다 면 두 번 째 포인터 가 가리 키 는 요소 보다 작 거나 같 아야 합 니 다.이 배열 에서 가장 작은 요 소 는 이 중간 요소 의 앞 에 있어 야 합 니 다.우 리 는 두 번 째 지침 을 이 중간 요 소 를 가리 키 면 찾 는 범 위 를 좁 힐 수 있다.우 리 는 이어서 업 데 이 트 된 두 개의 지침 으로 새로운 중간 요 소 를 얻 고 비교 하 며 순환 했다.
【 코드 】
/*********************************
* :2015-01-04
* :SJF0115
* : ,
* :
**********************************/
#include <iostream>
using namespace std;
int SearchMin(int A[],int n){
if(n <= 0){
return -1;
}//if
int start = 0,end = n-1;
//
if(A[end] > A[start]){
return A[start];
}//if
//
//
while(start <= end){
int mid = (start + end) / 2;
// [start,mid] [mid,end]
if(A[mid] > A[start]){
start = mid;
}
// [start,mid] [mid,end]
else if(A[mid] < A[start]){
end = mid;
}
else{
return A[mid+1];
}
}//while
}
int main(){
int A[] = {2,3,4,5,6,7,8};
cout<<SearchMin(A,7)<<endl;
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
귀속할 필요가 없는 2점 찾기오늘 동료가 차에서 나에게 면접을 본다고 했는데, 이 문제가 있었는데, 그는 해내지 못했다 회사에 가서 직접 간단히 썼다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.