1. 程式人生 > >尋找旋轉有序陣列的最小值

尋找旋轉有序陣列的最小值

假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

請找出其中最小的元素。

你可以假設陣列中不存在重複元素。

示例 1:  輸入: [3,4,5,1,2] 輸出: 1

示例 2:  輸入: [4,5,6,7,0,1,2] 輸出: 0

思路:使用二分查詢

       首先要判斷這個有序陣列是否旋轉了,通過比較第一個和最後一個數的大小,如果第一個數小,則沒有旋轉,直接返回這個數。如果第一個數大,就要進一步搜尋。我們定義left和right兩個指標分別指向開頭和結尾,還要找到中間那個數,然後和left指的數比較,如果中間的數大,則繼續二分查詢右半段陣列,反之查詢左半段。終止條件是當左右兩個指標相鄰,返回小的那個。

 public int findMin(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        while(nums[left] > nums[right]){//陣列為旋轉陣列
            while(left != (right - 1)){
                int mid = (left + right) / 2;
                if(nums[left] < nums[mid]){
                    left = mid;
                }else{
                    right = mid;
                }
            }
            return Math.min(nums[left], nums[right]);
        }
        return nums[0];
 }