1. 程式人生 > >leetcode - 154 尋找旋轉排序陣列中的最小值Ⅱ

leetcode - 154 尋找旋轉排序陣列中的最小值Ⅱ

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

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

請找出其中最小的元素。

注意陣列中可能存在重複的元素。

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

示例 2: 輸入: [2,2,2,0,1] 輸出: 0

思路:

       {2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 1, 2} 和 {2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2}, 我們發現,當第一個數字和最後一個數字,還有中間那個數字全部相等的時候,二分查詢法就崩潰了,因為它無法判斷到底該去左半邊還是右半邊。這種情況下,我們將左指標右移一位,略過一個相同數字,這對結果不會產生影響,因為我們只是去掉了一個相同的,然後對剩餘的部分繼續用二分查詢法,在最壞的情況下,比如陣列所有元素都相同,時間複雜度會升到O(n)。

 public int findMin(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        int mid = 0;
        while(nums[left] >= nums[right]){
            if(right - left == 1){
                mid = right;
                break;
            }
            mid = left + (right - left) / 2;
            if(nums[mid] == nums[left] && nums[mid] == nums[right]){
                int result = nums[left];
                for(int i = left + 1; i <= right; i++){
                    if(result > nums[i]){
                        result = nums[i];
                    }
                }
                return result;
            }
            if(nums[mid] <= nums[right]) right = mid;
            if(nums[mid] >= nums[left]) left = mid;
        }
        return nums[mid];
 }