問題描述:
假設按照升序排序的數組在預先設定的某個點上進行了旋轉,請找出其中最小的數。
問題分析:
這個可以採用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]均可 */
}
};