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%的代码,好鸡冻啊好鸡冻~