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

思路:如果陣列是排序陣列,那麼第一個元素是小於最後一個元素的,如果是排序後的旋轉陣列,那麼第一個元素肯定是大於最後一個元素。 我們可以通過最普通的查詢方法,時間複雜度為O(n), 但是用二分法進行查詢,時間複雜度是普通方法的一半;排序後的旋轉陣列有一個特點,那就是前半部分有序陣列是大於後半部分的。所以,如果nums[mid] 在第一部分 執行if nums[mid]>nums[end] 那麼最小元素肯定在nums[mid]後面。 如果在第二部分,執行else 。

class Solution {
    public int findMin(int[] nums) {
        if(nums==null){
            return 0;
        }else if(nums.length==1 || nums[0]<nums[nums.length-1]){
            return nums[0];
        }
        int start=0;
        int end=nums.length-1;
        int mid=(start-end)/2;
        while(start<end){
            mid=(start+end)/2;
            if(nums[mid]>nums[end]){
                start=mid+1;
            }else{
                end=mid;
            }
                
        }
        return nums[start];
    }
}