码迷,mamicode.com
首页 > 编程语言 > 详细

旋转数组的最小数字

时间:2018-01-14 17:40:28      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:sof   旋转   指针   ddl   i++   private   ++   题目   一个   

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

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{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 }

 

旋转数组的最小数字

标签:sof   旋转   指针   ddl   i++   private   ++   题目   一个   

原文地址:https://www.cnblogs.com/jiangyi-uestc/p/8283568.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!