剑指Offer——旋转数组的最小数字

1、题目描述

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

2、代码实现

 1 package com.baozi.offer;
 2 
 3 /**
 4  * 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
 5  * 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。
 6  * 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
 7  * NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
 8  *
 9  * @author BaoZi
10  * @create 2019-07-11-10:07
11  */
12 public class Offer6 {
13     public static void main(String[] args) {
14         int[] array = new int[]{3, 4, 5, 1, 2};
15         Offer6 offer6 = new Offer6();
16         int reslut = offer6.minNumberInRotateArray(array);
17         System.out.println(reslut);
18     }
19 
20     // 这里使用了二分查找的思想,查找效率肯定要比遍历查找的效率高的多。
21     public int minNumberInRotateArray(int[] array) {
22         //1、先判断数组为特殊情况的时候(检查边界值)
23         if (array == null || array.length == 0) {
24             return 0;
25         }
26         int first = 0;
27         int last = array.length - 1;
28         int indexMin = 0;
29         //2、这里array[first] >= array[last]说明这个数组肯定经过旋转了
30         //因为原数组是递增序列,如果没有旋转array[first] <=array[last]
31         while (array[first] >= array[last]) {
32             //3、指针first始终指向的是前边一个递增子数组序列,last始终指向的是第二个递增子数组序列
33             //当last - first == 1说明first指向第一个序列的最后一个元素,last指向第二个序列的第一个元素
34             //而且last指向的元素就是整个数组的最小元素
35             if (last - first == 1) {
36                 indexMin = last;
37                 break;
38             }
39             indexMin = (first + last) / 2;
40             //4、array[indexMin] >= array[first]说明indexMin指向的是第一个序列中的元素
41             if (array[indexMin] >= array[first]) {
42                 first = indexMin;
43                 //5、array[indexMin] <= array[last]说明indexMin指向的是第二个序列中的元素
44             } else if (array[indexMin] <= array[last]) {
45                 last = indexMin;
46             }
47         }
48         return array[indexMin];
49     }
50 }

 

posted @ 2019-07-11 10:14  包子的百草园  阅读(118)  评论(0编辑  收藏  举报