zoukankan      html  css  js  c++  java
  • 旋转数组的最小数字

    【题目】旋转数组的最小数字

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

     1 /**
     2  * 旋转数组的最小数字
     3  * 
     4  * @author Administrator
     5  * 
     6  *         测试用例: null 1 1,2,3,4,5 3,4,5,1,2 1,0,1,1,1 1,1,1,0,1 2,3,4,5,1,2,2,2
     7  * 
     8  *         时间复杂度:O(logn)
     9  */
    10 public class Main {
    11 
    12     public static void main(String args[]) {
    13 
    14         int[] array = { 2, 3, 4, 5, 1, 2, 2, 2 };
    15 
    16         Main main = new Main();
    17 
    18         System.out.println("min num: " + main.getMinNum(array));
    19     }
    20 
    21     private Integer getMinNum(int[] array) {
    22 
    23         if (null == array || 0 == array.length) {
    24             return null;
    25         }
    26 
    27         if (array.length == 1) {
    28             return array[0];
    29         }
    30 
    31         int head = 0;
    32         int tail = array.length - 1;
    33         int middle = 0;
    34 
    35         if (array[head] < array[tail]) {
    36             return array[head];
    37         }
    38 
    39         while (tail - head > 1) {
    40 
    41             middle = (head + tail) / 2;
    42 
    43             // 头 尾 中间元素值相同,无法判断指针的移动方向,转为顺序查找
    44             if (array[head] == array[middle] && array[middle] == array[tail]) {
    45                 return minOrder(array, head, tail);
    46             }
    47 
    48             // 中间元素值大于头元素值,头指针移动到中间位置
    49             if (array[head] <= array[middle]) {
    50                 head = middle;
    51                 continue;
    52             }
    53 
    54             // 中间元素值小于尾元素值,尾元素移动到中间位置
    55             if (array[tail] >= array[middle]) {
    56                 tail = middle;
    57                 continue;
    58             }
    59         }
    60 
    61         return array[tail];
    62     }
    63 
    64     private Integer minOrder(int[] array, int head, int tail) {
    65 
    66         int minNum = array[head];
    67 
    68         for (int i = head; i <= tail; i++) {
    69             if (array[i] < minNum) {
    70                 minNum = array[i];
    71             }
    72         }
    73 
    74         return minNum;
    75     }
    76 }
  • 相关阅读:
    杂想
    杂题操作
    codeforces 11D(状压dp)
    2019 计蒜之道 复赛 “星云系统” (单调栈)
    SPOJ VLATTICE (莫比乌斯反演)
    2019 ICPC 陕西西安邀请赛 D. Miku and Generals
    buerdepepeqi 的模版
    HDU 2588 GCD
    二项式反演
    2014ACM/ICPC亚洲区西安站 F题 color (组合数学,容斥原理)
  • 原文地址:https://www.cnblogs.com/jiangyi-uestc/p/8283568.html
Copyright © 2011-2022 走看看