[쿠폰] [11] [] 어레이의 최소 회전 요소

제목 설명

  여러 요소들의 어레이의 초기 배열은, 우리가 회전 호출 배열의 끝으로 이동. 어레이 출력의 비 회전, 회전 정렬의 입력 배열 저장 작은 소자 . 예를 들어, 배열 {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;
    }
}

코드 링크

안전 코드를 증명하는 행사는 -Java

추천

출처www.cnblogs.com/haoworld/p/boffer11-xuan-zhuan-shu-zu-de-zui-xiao-yuan-su.html