剑指offer算法题006:旋转数组的最小数字

小编在求职找找工作期间剑指offer上的算法题刷了很多遍,并且每道题小编当时都总结了一种最适合面试时手撕算法的最优解法。考虑到剑指offer算法题在面试中的高频出现,小编每天和大家分享一道剑指offer上的算法题,以及小编总结的答案。下面是第006道剑指offer算法题:

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。例如,
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如,数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

解析:

见代码注释


public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if(array[0]<array[array.length-1])    return array[0];//输入数组没有旋转
         
        int low = 0 ; int high = array.length - 1;
         
        //最小的数字在旋转之后的第二部分递增序列中,所以只需要不断逼近第二段递增序列的第一个元素即可
        while(low < high){
            int mid =(high + low)>>1;     
             
            if(array[mid] < array[high]){//[mid,high]属于第二段递增序列。所以的往前寻找第二段递增序列的开头,移动high指针
                high = mid;
            }else if(array[mid] > array[high]){//mid在第一段递增序列中,high在第二段递增序列中,在mid之后寻找第二段递增序列的开头
                low = mid+1;
            }else{//相等无法判断mid在那个递增序列中
                high--;
            }  
        }
        return array[low];
    }
     
    //两个都可以过,这种解法有点奇怪,当数组有序的时候,应该是通不过d
    public int minNumberInRotateArray2(int [] array) {
        int low = 0 ; int high = array.length - 1;
        //最小的数字在递减部分,所以只需判断哪一部分递减即可
        //另外第一部分不递减,那么第二部分就一定递减,锁以只需要判断一半即可
        while(low < high){
            int mid =(high + low) >> 1;       
            if(array[mid] < array[low]){//如果前半段递减的话,最小值在前半段
                high = mid;
            }else if(array[mid] == array[low]){
                low = low + 1;
            }else if(array[mid]>array[low]){//这里不好判断,因为low可能是最小值
                low = mid;//这里表示后半段递减,所以最小值在前半段
            }  
        }
        return array[low];
    }
}

其他文章

1. 学习笔记和学习资料汇总:前端 + 后端 + java + 大数据 + python + 100多实战项目 + C++

2. 我的秋招经历总结:一站式秋招规划

3. 零基础学爬虫

4. 零基础C++学习总结

欢迎关注个人公众号【菜鸟名企梦】,公众号专注:互联网求职面经javapython爬虫大数据等技术分享:

公众号菜鸟名企梦后台发送“csdn”即可免费领取【csdn】和【百度文库】下载服务;

公众号菜鸟名企梦后台发送“资料”:即可领取5T精品学习资料java面试考点java面经总结,以及几十个java、大数据项目,资料很全,你想找的几乎都有

扫码关注,及时获取更多精彩内容。(博主985、A+学科硕士,今日头条大数据工程师)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值