Find Minimum in Rotated Sorted Array

来源:互联网 发布:支付宝mac客户端下载 编辑:程序博客网 时间:2024/06/11 04:08

(1)假设一个有序数组,经过翻转后,求其最小值?

(2)更进一步,如果该有序数组中包含重复的数,再求其最小值?

对于第(1)问,可以直接对该数组再次排序,求最小值,但是时间复杂度高,至少O(nlogn),而并没有利用有序数组翻转这一条件,继续思考,

对于像有序数组翻转的问题,大部分都用折半的方法去做,可以用于折半查找(即折半后至少有一段是有序的,进而判断target是否在有序段,若在有序段查找,若不在有序段,则在非有序段查找    当然对于有重复的数,仍然要略过),而对于折半去找最小值这个问题,可以看具体例子可知,初始时如果没经过旋转,最小值一定在下标最小处,若经过旋转,下标最小处的值肯定大于下标最大处的值。经过一定的规则更新最小处小标和最大处下标,当下标最小处的值小于下标最大处的值或下标最小处等于下标最大处时,停止迭代,返回下标最小处的值即可。

class Solution {
public:
    int findMin(vector<int>& nums) {
        //二分法来实现,折半查找
        int begin=0;
        int end=nums.size()-1;
        int middle;
        while(begin<end&&nums[begin]>=nums[end])
        {
            middle=begin+(end-begin)/2;
            if(nums[begin]<nums[middle])//此时从begin 到 middle 是有序的,而从begin 到end 非有序,则最小值在  middle+1到 end之间
            {
                begin=middle+1;
            }
            else if(nums[middle]==nums[begin])//这种情况只是在数组中有重复的数时的出现,则忽略这个重复的数 ,往前
            {
                begin++;
            }
            else//同理此时从middle 到 end 是有序的,而从begin 到end 非有序,则最小值在  begin到middle 之间
            {
                end=middle;
            }
        }
        return nums[begin];
    }
};

0 0