旋转数组中的最小数字(中)

Posted 小布丁value

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转数组中的最小数字(中)相关的知识,希望对你有一定的参考价值。

在这里插入图片描述

无重复元素

在这里插入图片描述
if numbers[mid]>numbers[right] 说明前面有序,最小值一定在后面
left=mid+1
在这里插入图片描述
if numbers[mid]<numbers[right] 说明后半部分一定有序,最小值在前面
right=mid;
在这里插入图片描述
模拟整个过程会发现当 left==right时退出循环
找到numbers[left]即位最小值

有重复元素

在这里插入图片描述
如果有重复元素
numbers[right]=numbers[left]
right–;
在这里插入图片描述
不等的时候又按照无重复元素进行判断即可
代码实现如下:

class Solution {
    public int minArray(int[] numbers) {
        int left=0; int right=numbers.length-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];

    }
}

三个问题

在这里插入图片描述

为什么right–不会对结果产生影响

在这里插入图片描述

为什么right = mid 而left = mid+1;

在这里插入图片描述

时间复杂度

在这里插入图片描述

以上是关于旋转数组中的最小数字(中)的主要内容,如果未能解决你的问题,请参考以下文章

旋转数组中的最小数字

旋转数组的最小数字(C++ 和 Python 实现)

剑指 Offer 11. 旋转数组的最小数字

剑指 Offer 11. 旋转数组的最小数字 154. 寻找旋转排序数组中的最小值 II 二分

旋转数组中的最小数字(中)

剑指Offer之旋转数组中的最小数字(题8)