您的位置:首页 > 其它

寻找旋转排序数组中的最小值 II

2018-01-04 21:15 330 查看
假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2)。

你需要找到其中最小的元素。

数组中可能存在重复的元素。

我的想法是:

遍历数组来进行的查找,效率不高但是通过了测试。

int findMin(vector<int> nums) {

        // write your code here

        int num = nums.size();

        if(num == 1)

            return nums[0];

        

        for(int i = 0 ; i < num-1 ; i ++){

            if(nums[i] > nums[i+1])

                return nums[i+1];

        }

        return nums[0];

    }

答案:

因为是已经基本上排好序的数组,因此使用二分法会很有效果。相当于使用二分法来找一个特别的数。

但是是如何判断是去调查中点右边数组还是左边数组?

因为数组分两段,我要找原来在前面现在放在了后面的数组小段,这个数组小段的特点就是一定都小于数组的结尾节点。通过这个结尾节点来判断中点节点是处于那一个小段以及应该如何选择左右。

需要注意的就是:如果相等时的hi-- 例如:1,1,-1,1就需要这样去--;

int findMin(vector<int> &num) {

        // write your code here

         int lo = 0;

        int hi = num.size()-1;

        while(lo<hi){

            int mid = lo + (hi - lo)/2;

            if(num[mid]>num[hi]){

                lo = mid+1;

            }else if(num[mid]<num[hi]){

                hi = mid;

            }else{

                hi--;

            }

        }

        return num[lo];

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: