153. 尋找旋轉排序數組中的最小值
思路一:
比較暴力的求解,找到翻轉的點(由升序變爲降序),有找到這個點,則就是下一個點就是。沒有找到這個點,就是第一個點。
class Solution {
public:
int findMin(vector<int>& nums) {
int size = nums.size();
int i,tmp;
if(size==1){
return nums[0];
}
for(i=1,tmp=nums[0];i<size;i++){
if(nums[i]<tmp){
break;
}
tmp=nums[i];
}
if(i!=size){
return nums[i];
}else{
return nums[0];
}
}
};
思路二:
我們需要知道,對於一個區間A,如果A[start] < A[stop],那麼該區間一定是有 序的了。
另外,由於不含重複元素,需要分兩種情況。
對於一個輪轉了的排序了的數組,
如果nums[mid]>nums[left],最小值一定在右半區間
如果nums[mid]<nums[left],最小值一定在左半區間
class Solution {
public:
int findMin(vector<int>& nums) {
for (int low = 0, high = nums.size() - 1; low <= high;){
if (nums[low] <= nums[high]){
return nums[low];
}
int mid = low + (high - low) / 2;
if (nums[mid] > nums[high]){
low = mid + 1;
} else {//[3,1,2]
high = mid;
}
}
return INT_MIN;
}
};
static const auto __lamda = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();