https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/
這個(gè)題目,元素是unique的。難度并不高,二分細(xì)節(jié)難搞,沒關(guān)系,咱們記住套路。
154是個(gè)hard, 元素是可以重復(fù)的,先不做。先把這個(gè)題套路記住了。
分三種情況:
1) 1 2 3 4 5
無旋轉(zhuǎn),最小值在左,左<中<右,收縮右邊界。
- 4 5 1 2 3
有旋轉(zhuǎn),最小值在左,左>中,中<右,收縮右邊界。(中可能是最?。?br> 3) 2 3 4 5 1
有旋轉(zhuǎn),最小值在右,左<中,中>右,收縮左邊界。(中不可能是最?。?/li>
分析前面三種可能的情況,會(huì)發(fā)現(xiàn)情況1、2是一類,情況3是另一類。
如果中值 < 右值,則最小值在左半邊,可以收縮右邊界。
如果中值 > 右值,則最小值在右半邊,可以收縮左邊界。
class Solution {
public:
int findMin(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left < right) {
int mid = left + (right - left) / 2; /* 地板除,mid更靠近left */
if (nums[mid] < nums[right]) {
right = mid; /* 因?yàn)橹兄?< 右值,中值也可能是最小值,右邊界只能取到mid處 */
} else {
left = mid + 1; /* 因?yàn)橹兄?> 右值,中值肯定不是最小值,左邊界可以跨過mid */
}
}
return nums[left]; /* 循環(huán)結(jié)束,left == right,最小值輸出nums[left]或nums[right]均可 */
}
}
按照這個(gè)模板,記住就好!以上分析都是為了輔助記憶!
二分套路總結(jié):
https://leetcode-cn.com/problems/search-insert-position/solution/te-bie-hao-yong-de-er-fen-cha-fa-fa-mo-ban-python-/