Leetcode典型題解答和分析、歸納和彙總——T153(尋找旋轉排序數組中的最小值)

問題描述:

假設按照升序排序的數組在預先設定的某個點上進行了旋轉,請找出其中最小的數。

問題分析:

這個可以採用C++庫函數直接完成任務,但是爲了直觀顯示這這個查找過程,我們應該要充分利用這個數組的特性,使用二分查找,可以大大提升效率。

class Solution {
public:
    int findMin(vector<int>& nums) {
        int left = 0;
        int right = nums.size() - 1;                /* 左閉右閉區間,如果用右開區間則不方便判斷右值 */ 
        while (left < right) {                      /* 循環不變式,如果left == right,則循環結束 */
            int mid = left + (right - left) / 2;    /* 地板除,mid更靠近left */
            if (nums[mid] > nums[right]) {          /* 中值 > 右值,最小值在右半邊,收縮左邊界 */ 
                left = mid + 1;                     /* 因爲中值 > 右值,中值肯定不是最小值,左邊界可以跨過mid */ 
            } else if (nums[mid] < nums[right]) {   /* 明確中值 < 右值,最小值在左半邊,收縮右邊界 */ 
                right = mid;                        /* 因爲中值 < 右值,中值也可能是最小值,右邊界只能取到mid處 */ 
            }
        }
        return nums[left];    /* 循環結束,left == right,最小值輸出nums[left]或nums[right]均可 */     
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章