剑指offer 22. 旋转数组的最小数字- java实现

原题链接

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

输入一个升序的数组的一个旋转,输出旋转数组的最小元素。

例如数组 {3,4,5,1,2} 为 {1,2,3,4,5} 的一个旋转,该数组的最小值为 1。

数组可能包含重复项。

注意:数组内所含元素非负,若数组大小为 0,请返回 −1。

数据范围
数组长度 [0,90]。

代码案例:输入:nums = [2, 2, 2, 0, 1]
输出:0

题解 - O(n)

在这里插入图片描述
这道题采用二分法查找 但是右半部分不满足二分 二分法的前提是数组必须是有序的 所以要把黑色的部分去掉 左半部分满足二分查找 而找到最小值的求解就是求右半部分的最小值 mid 在最小值的右边 所以二分模板选择不加1 的
所以首先要取消黑色部分那相等的部分
另外 要考虑特殊情况 就是完全单调的情况下 也就是右半部分在左半部分的上面

二分查找的模板请参考

 class Solution {
    public int findMin(int[] nums) {
        int n = nums.length -1;
        if(n < 0 ) return -1;
        while(n > 0&&nums[0] == nums[n] ) n--;//先删掉右边横着的部分
        if(nums[n] >= nums[0]) return nums[0];//特殊情况
        int l = 0; int r  = n ;
        while( l < r ){
            int mid = l + r >> 1 ;
            if( nums[0] >  nums[mid]) r = mid ;
            else l = mid + 1 ;
        }
        return nums[l] ;//nums[r] 也可以
    }
}
posted @   依嘫  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示