题解 | #旋转数组的最小数字#

旋转数组的最小数字

https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba

import java.util.ArrayList;
public class Solution
{
    public int minNumberInRotateArray(int [] array)
    {
        int l, r;
        
        l = 0;
        r = array.length - 1;
        while(l < r)
        {
            int mid = (l + r) / 2;
            
            if(array[mid] > array[r])
            {
                l = mid + 1;
            }
            else if(array[mid] == array[r])
            {
                // 这里必须要特别注意,当array[mid] == array[r] 的时候,首先确定一点是这种情况下是不清楚旋转点在mid左还是右的,参考[1,2,1,1,1]和[1,0,1,1,1]。所以此时只能l或r挪动一个,一个一个排查,但为什么挪动的不是l而是r呢?首先l我们不确定是否在旋转点上,
                // 如果l在旋转点上的话肯定是不能挪动l的,再看r,如果r和mid同一个元素上的话,由于这个元素可能是旋转点,我们依然不能挪动r,但是,因为我们能够确定r和mid一定不是同一个索引,所以在mid和r的元素值相等时,我们一定可以让r挪动。
                // 那么为什么我们能够确定mid和r一定不是同一个索引号呢?因为mid = (l + r) / 2这个式子是向下取整的,所以r和mid相等只在一个前提条件下才会成立,就是l==r,如果l不等于r,mid就一定不会和r相等,而我们的while循环保证了在循环内l一定不等于r,所以,
                // 在array[mid] == array[r],我们可以挪动r,也只能挪动r。
                r--;      
            }
            else
            {
                r = mid;
            }
        }
        
        return array[l];
    }
}
全部评论

相关推荐

牛客鼠:校友你这简历基本无敌了,春招刷刷题去冲大厂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务