剑指offer第二版-11.旋转数组的最小数字(二分查找)

本系列导航:剑指offer(第二版)java实现导航帖

面试题11:旋转数组的最小数字

题目要求:
把一个数组最开始的若干个元素搬到末尾成为数组的旋转,如1,2,3,4,5=>3,4,5,1,2;0,1,1,1,1=>1,1,1,0,1;0,1,1,1,1=>1,0,1,1,1。求一个原本递增的数组旋转后的最小数字。

解题思路:
考察二分查找。原本有序,进行了旋转,但在一定程度上还是有序的。有了这个出发点,如果熟悉二分查找应该就离最终结果差不多了。通过观察中间点与左右点的关系,缩小范围,从而找到最小值。缩小范围时要注意值相等的情况,尤其是左右中三个值都相等的情况,这种特殊情况是无法折半缩小范围的,只能逐步缩小,即左右点各缩进一个单位。
此题比较考验逻辑,明白为什么能用二分查找 && 把各个ifelse情况理清楚 -> 解决

package chapter2;

/**
 * Created by ryder on 2017/6/28.
 * 旋转数组的最小数字
 */
public class P82_MinNumberInRotatedArray {
    public static int min(int[] data){
        if(data==null || data.length==0)
            return -1;
        int left = 0;
        int right = data.length-1;
        int mid;
        while(left<right){
            mid = left+(right-left)/2;
            //left < right
            if(data[left]<data[right])
                return data[left];
            //left > right
            else if(data[left]>data[right]){
                if(data[mid]>=data[left])
                    left = mid + 1;
                else
                    right = mid;
            }
            //left = right
            else{
                if(data[left]<data[mid])
                    left = mid + 1;
                else if(data[left]>data[mid])
                    right = mid;
                else{
                    left = left+1;
                    right = right-1;
                }
            }
        }
        return data[right];
    }
    public static void main(String[] args){
        int[] data1 = {3,4,5,1,2};
        int[] data2 = {1,0,1,1,1};
        int[] data3 = {1,1,1,0,1};
        System.out.println(min(data1));
        System.out.println(min(data2));
        System.out.println(min(data3));
    }
}

运行结果

1
0
0

推荐阅读更多精彩内容

  • 旋转数组的最小数字 题目 给定一个递增的旋转数组A,返回旋转数组中的最小值。旋转数组:给定一个已排序的数组,假设为...
    蓝雪冬荷阅读 147评论 0 0
  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 3,040评论 0 17
  • 剑指 offer 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成...
    faremax阅读 1,145评论 0 7
  • 说明: 本文中出现的所有算法题皆来自牛客网-剑指Offer在线编程题,在此只是作为转载和记录,用于本人学习使用,不...
    秋意思寒阅读 679评论 1 1
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    StarryThrone阅读 3,035评论 0 10