1 . 尋找旋轉排序數組中的最小值
假設一個旋轉排序的數組其起始位置是未知的(比如0 1 2 4 5 6 7 可能變成是4 5 6 7 0 1 2)。
你需要找到其中最小的元素。
你可以假設數組中不存在重複的元素。
樣例
給出[4,5,6,7,0,1,2] 返回 0
solution: 本題可以直接使用蠻力法計算複雜度爲O(n),但是使用蠻力法的話會失去本題的意思,因爲數組是由排序數組旋轉之後構成的並且沒有重複的元素,因此,我們可以使用二分法來求解這個問題。
二分法會保持三個索引first, mid 和 last。一個旋轉之後的排序數組其最小值只有三種情況。
1.在mid的左邊
2.就爲mid
3.在mid的右邊
因爲數組是由排序數組經過旋轉之後所構成,並且從上面的圖片可以看出,當num[mid] > num[last]時其最小值必定在[mid, last]區間,否則在[first, mid]區間。則,我們可以繼續對這個區間進行判斷直到只有兩個元素時停止計算。
code .
class Solution {
public:
/**
* @param num: a rotated sorted array
* @return: the minimum number in the array
*/
int findMin(vector<int> &num) {
// write your code here
vector<int>::size_type first = 0, last = num.size()-1, mid;
while ((first + 1) < last) {
mid = (first + last) / 2;
if (num[mid] < num[last])
last = mid;
else
first = mid;
}
return num[first] < num[last] ? num[first] : num[last];
}
};
2 . 尋找旋轉排序數組中的最小值 II
假設一個旋轉排序的數組其起始位置是未知的(比如0 1 2 4 5 6 7 可能變成是4 5 6 7 0 1 2)。
你需要找到其中最小的元素。
數組中可能存在重複的元素。
樣例
給出[4,4,5,6,7,0,1,2] 返回 0
solution: 因爲數組中存在相同的元素及有可能存在nums[mid] = nums[last]的情況,這時上面三種情況就不管用了。因爲當nums[mid]=nums[last]時,最小值在mid的左邊還是右邊沒有辦法進行判斷。此時唯一可以確定的是last一定不是最小值(當最小值唯一時),因此我們可以通過把last向前移動一步來減少搜索區間
code :
class Solution {
public:
/**
* @param num: the rotated sorted array
* @return: the minimum number in the array
*/
int findMin(vector<int> &num) {
// write your code here
vector<int>::size_type first = 0, last = num.size()-1, mid;
while (first + 1 < last) {
mid = first + (last - first) / 2;
if (num[mid] > num[last])
first = mid;
else if (num[mid] < num[last])
last = mid;
else
--last;
}
return num[first] < num[last] ? num[first] : num[last];
}
};