제목 설명
여러 요소들의 어레이의 초기 배열은, 우리가 회전 호출 배열의 끝으로 이동. 어레이 출력의 비 회전, 회전 정렬의 입력 배열 저장 작은 소자 . 예를 들어, 배열 {3,4,5,1,2} {1,2,3,4,5}은 최소 어레이의 회전이다. 주 : 배열 크기가 0을 반환, 0이면 모든 요소는, 0보다 큰에 제시되어있다.
아이디어 분석
사용하여 이진 탐색 은 IS로서 생각 어레이의 회전은 두 가지로 나눌 수있다 서브 정렬 된 배열 및 최소 요소 두 어레이의 경계가 배치 단부는 그 배열 요소 개의 인덱스 포인터 좌표를 종료하면, 중간 요소를 결정 크기 관계 :
- 경우 중간 요소 > = 첫 번째 요소는 이후의 중간 요소, 제 포인터의 작은 요소를 찾고 설명 중간 요소 ;
- 상기 중간 요소 경우 <= 마지막 요소 다음 중간 요소, 제 포인터 앞보고 작은 소자 중간 요소 ;
- 이것은 위 배열의 마지막 요소에 최종 제 포인터 포인트를 좁은 검색을 반복하고, 두 번째 포인터는 작은 원소이면의 배열의 선두의 요소, 즉 두 개의 인접하는 포인터를 가리 그 포인터의 번째 요소이고
특별한 경우 : 중간 요소, 첫 번째 요소에 대한 포인터, 두 번째 요소 포인터 포인트가 동일하고 아이디어를 발견 할 수 없습니다하는 경우 두 지점을 사용할 수 의 순서를 찾기 위해 최소를 찾기 위해 아이디어를
자바 코드
public class Offer011 {
public static void main(String[] args) {
// int [] arr = {3,4,5,1,2};
int [] arr = {1,0,1,1,1};
int minNumberInRotateArray = minNumberInRotateArray(arr);
System.out.println(minNumberInRotateArray);
}
public static int minNumberInRotateArray(int [] array) {
return Solution1(array);
}
/**
* 利用二分查找的思路,注意:要考虑特殊情况
* @param array
* @return
*/
public static int Solution1(int [] array) {
int index1 = 0;
int index2 = array.length-1;
int indexMid = index1;
while(array[index1]>=array[index2]) {
if(index2-index1==1) {
indexMid= index2;
break;
}
indexMid = (index1+index2) >>1;
if(array[index1] == array[index2] && array[indexMid] == array[index1]) {
//特殊情况:要用顺序查找
return MinInOrder(array, index1, index2);
}
if(array[indexMid]>=array[index1]) {
index1 = indexMid;
}else if(array[indexMid]<=array[index2]) {
index2 = indexMid;
}
}
return array[indexMid];
}
/**
* 在index1和index2之间顺序查找最小值
* @param array 在此数组中进行查找
* @param index1 开始索引位置
* @param index2 结束索引位置
* @return
*/
private static int MinInOrder(int[] array,int index1,int index2) {
int min = array[index1];
for(int i=index1+1;i<=index2;i++) {
if(min > array[i]) {
min = array[i];
}
}
return min;
}
}