【剑指Offer 8】旋转数组的最小数字

题目:把一个数组最开始的若干个元素搬到数组的末尾, 我们称之数组的旋转。输入一个递增排序的数组的一个旋转, 输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1

Java代码如下:

package demo;

public class TestMinNum {
    /**
     * @param number 旋转数组
     * @return 数组的最小值
     */
    public static int min(int[] number) {
        // 判断输入是否合法
        if(number == null || number.length == 0) {
            throw new RuntimeException("Invalid input");
        }
        // 开始处理的第一个位置
        int low = 0;
        // 开始处理的最后一个位置
        int high = number.length - 1;
        // 设置中间位置初始值为第一个位置的值
        int middle = low;
        // 旋转数组的第1个元素不小于最后1个元素
        while(number[low] >= number[high]) {
            // 当处理范围只有2个数据时,返回后一个结果
            if(high - low == 1) {
                return number[high];
            }
            // 取中间位置
            middle = low + (high - low) / 2;
        
            // 特殊情况;如果3个数都相等,则需要进行顺序处理,从头到尾找最小值
            if(number[middle] == number[low] && number[high] == number[middle]) {
                return minInOrder(number, low, high);
            }
        
            // 如果中间位置对应的值在前1个排好序的部分,将low设置为新的位置
            if(number[middle] >= number[low]) {
                low = middle;
            } else if(number[middle] <= number[high]) {
                // 如果中间位置对应的值在后1个排好序的部分,将high设置为新的位置
                high = middle;
            }
        
        }
        // 返回最终的处理结果
        /*
         * 同时包含了特殊情况:旋转数组本身就是排序数组:number[low] < number[high],
         * 则直接将low位置的值返回
         */
        return number[middle];
    }

    // 特殊情况;如果3个数都相等,则需要进行顺序处理,从头到尾找最小值
    private static int minInOrder(int[] number, int low, int high) {
        int min = number[low];
        for (int i = low; i < high; i++) {
            if(min > number[i]) {
                min = number[i];
            }
        }
        return min;
    }

    public static void main(String[] args) {
        // Test1. 典型输入:单调升序的数组的一个旋转
        int[] number1 = {3, 4, 5, 1, 2};
        System.out.println("Test1的结果: " + min(number1));
        // Test2. 有重复数字,并且重复数字刚好是最小的数字
        int[] number2 = {3, 4, 5, 1, 1, 2};
        System.out.println("Test2的结果: " + min(number2));
        // Test3. 最后一个数字重复
        int[] number3 = {3, 4, 5, 1, 2, 2};
        System.out.println("Test3的结果:" + min(number3));
        // Test4. 第1个数字,最后1个数字,中间数字重复
        int[] number4 = {1, 0, 1, 1, 1};
        System.out.println("Test4的结果:" + min(number4));
        // Test5. 第1个数字,最后1个数字,中间数字重复
        int[] number5 = {1, 1, 1, 0, 1};
        System.out.println("Test5的结果:" + min(number5));
        // Test6. 排序数组
        int[] number6 = {1, 2, 3, 4, 5};
        System.out.println("Test6的结果:" + min(number6));
        // Test7. 只有1个数字
        int[] number7 = {1};
        System.out.println("Test7的结果:" + min(number7));
        // Test8. 数字都相同
        int[] number8 = {1, 1, 1, 1, 1};
        System.out.println("Test8的结果:" + min(number8));
        // Test9. 输入为null
        // System.out.println("Test9的结果:" + min(null));
    }
}
运行结果

来源:http://blog.csdn.net/derrantcm/article/details/45457859

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容