【剑指office】旋转数组的最小数


【剑指office】旋转数组的最小数_第1张图片


看着花,说白了,暴力或者二分查找,还是那种完全不用变的。

暴力直接重新排序,然后返回第 0 个,太简单了不举例,这里用二分。

举个例子:

                                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​【剑指office】旋转数组的最小数_第2张图片

此时 Left 应该在 3 的位置上,而 Right 应该在 2 的位置上。

那么中间位置就是 5 。

将这个 5 跟最右边判断一下(也可以跟最左边),如果这个位置比 Right 小,就说明最小的那个数肯定不会在右边,同理,如果这个位置比 Right 大,就说明最小的那个数肯定不会在左边。

现在 Left 是 1 (Left = mid+1),Right 是 2 ,中间值是 1 。

1 < 2

所以 Right 要变到 1 的位置。

而二分的前提是 Left < Right

我们返回 Left即可。

其他情况也可以根据上面分析。

class Solution {
public:
    int minArray(vector& numbers) {
        int left = 0;
        int right = numbers.size()-1;
​
        while(left < right)
        {
            int mid = (left+right)/2;
            if(numbers[mid] < numbers[right])
                right = mid;
            else if(numbers[mid] > numbers[right])
                left = mid+1;
            else
                right--;
        }
        return numbers[left];
    }
};

你可能感兴趣的:(每日练习,算法)