Find Minimum in Rotated Sorted Array
原题(源自:https://oj.leetcode.com/problems/find-minimum-in-rotated-sorted-array/):
Suppose a sorted array 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。
1.直接裸算o(n)可以测试通过,代码如下:
class Solution {
public:
    int findMin(vector<int> &num) {
        int n = num.size();
        for(int i = 0;i < n - 1;i ++)
        {
            if(num[i] > num[i+1])
                return num[i+1];
        }
        return num[0];
    }
};
所以原题原意就是2个递增序列合并,注意没有相同元素,很简单。
2.折半查找o(logn)代码如下:
class Solution {
public:
  int findMin(vector<int> &num) {
    int left = 0;
    int right = num.size() - 1;
    while(left < right)
    {
        int mid = (left + right)/2;
        if(num[left] < num[right])
            return num[left];
        if(num[mid] >= num[left])
        {
           left = mid + 1;
        }
        else
            right = mid;
    }
    return num[left];
  }
};
大致分析如下:(注意两个递增序列不能交叉重叠,且没有特殊的中间元素,所以必有 序列1<序列2或序列1>序列2)
如果 num[left]<=num[mid] && num[mid]<num[right] 则 第一个元素就是所找
如果 num[left]<=num[mid] && num[mid]>num[right] 则 left = mid + 1;
如果 num[left]> num[mid] && num[mid]<num[right] 则 right = mid;
如果 num[left]> num[mid] && num[mid]>num[right] 则 不可能;
之后的子情况要么变成一个递增序列,此时就和上面第一种情况是一样的;要么仍然为2个递增序列合并,则和父情况一样。
                    
                

                
            
        
浙公网安备 33010602011771号