Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., <code>0 1 2 4 5 6 7</code> might become <code>4 5 6 7 0 1 2</code>).
Find the minimum element.
You may assume no duplicate exists in the array.
解題思路
這道題如果沒有進行變換,是典型的二分思想。
然而進行了變換,還是二分思想23333333333333
在區間內,如果最左端值小于最右端,那么該序列一定是升序排序的,那么問題解決。
如果是形如“/ /”的兩段上升序列,找到最中間的數。如果該數比最左側的值大,那么該數仍可與最右端的數組成形如“/ /”的兩段上升序列;如果比左側小,則左側與該數形成形如“/ /”的兩段上升序列。即,該問題一定可以分解為規模更小且結構相同的子問題。
當出現只有兩個數或者最左端小于最右端時,問題即被解決
代碼
class Solution {
public:
int findMin(vector<int>& nums) {
int len = nums.size();
return find(nums, 0, len-1);
}
int find(vector<int>& nums, int l, int r){
if (l+1 == r && nums[l] > nums[r]) return nums[r];
if (nums[l] <= nums[r]) return nums[l];
int mid = (l+r)>>1;
if (nums[mid] > nums[l]) return find(nums, mid, r);
else return find(nums, l, mid);
}
};
PS 居然打敗了100%的代碼,好雞凍啊好雞凍~