153. Find Minimum in Rotated Sorted Array(Medium)
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
Find the minimum element.
You may assume no duplicate exists in the array.
-------------------------------------------------------分割线---------------------------------------
今天挑了次题,第一次pick了道easy,不是很想写,第二次就拿到这道medium。
题设和要求都很简单,一个按照升序排好的数组,但是是循环的,从哪里起始是随机的(感觉描述的不是很清楚,可以参考题目的例子),要求得到数组最小值。且数组中没有重复的元素。
分析:
一个二分查找的变形题,可方法还是一样的,唯一需要更改的就是查找的条件,时间复杂度O(logn)。易得情况可分为以下三种。
1.左边大,右边也大,查找结束;
2.左边小,右边也小,查找结束;
3.左边小,右边大,也即是正常升序,继续查找。
在第3种情况下需要继续查找,查找的方向可以用一下几个条件判断:
1.左边(右边)子序列不满足升序条件,往左边(右边)继续查找;
2.左边和右边都满足升序,说明数组的顺序没有更改过,那直接返回最左边的端点值;
3.左边(右边)到头了,且右边(左边)是满足升序的,比较一下两个端点值,返回小的;
(2,3情况可以合并)
最后再考虑一下特殊情况,比如说只有1/2/3个数的时候,发现之前的都适用。收工收工。
多说一句,图中mid只是一个指针,不代表数组的中间结点。
代码:
class Solution{
public:
int findMin(vector<int>& nums){
int len = nums.size();
int left = 0,right = len-1,mid = (left+right)/2;
while (left < right){
mid = (left + right)/2;
int midNum = nums[mid],leftNum = nums[left],rightNum = nums[right];
int midPlus = nums[(mid+1)%len], midMinus = nums[(mid-1+len)%len];
//leftNum ………… midMinus midNum midPlus ………… rightNum
if (midPlus > midNum && midMinus > midNum) return midNum;
else if (midPlus < midNum && midMinus < midNum) return midPlus;
else{
if (midPlus > rightNum) left = (mid+1)%len;
else if (midMinus < leftNum ) right = (mid-1+len)%len;
else return leftNum < rightNum?leftNum:rightNum;
}
}
return nums[mid];
}
};
-------------------------分割线-------------------------------------------------
题解后面再补。写题解的时间比写题的时间多多了…而且感觉写不清楚,有点失落。