旋转数组的最小数字

Posted 粽子丫丫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转数组的最小数字相关的知识,希望对你有一定的参考价值。

 

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。  输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。

例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。  NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

java解法(牛客网通过):

 1 import java.util.ArrayList;
 2 public class Solution {
 3     public int minNumberInRotateArray(int[] array) {
 4            int len = array.length;
 5            if(array == null||len <1){
 6                return 0;
 7            }
 8           int index1 = 0;
 9           int index2 = len - 1;
10         int indexMid = index1;
11         while(array[indexMid] >= array[index2]){
12             if(index2 - index1 ==1){
13                 indexMid = index2;
14                 break;
15             }
16             indexMid = (index1 + index2)/2;
17              
18             
19             if(array[index1] == array[index2]&&array[indexMid] == array[index1])
20                 return MinInOrder(array,index1,index2);
21             if(array[indexMid] >= array[index1])
22                 index1 = indexMid;
23             if(array[indexMid] <= array[index2])
24                 index2 = indexMid;
25             
26         }
27         return array[indexMid];
28         
29     }                                         
30     
31      public int MinInOrder(int[] array,int index1,int index2){
32         int result = array[index1];
33         for(int i = index1 + 1;i<index2;i++){
34             if(result > array[i])
35                 result = array[i];
36         }  
37                 return result;
38     }
39 }
MinInOrder()函数主要是处理特殊情况,当数组为{1,0,1,1,1}和{1,1,1,0,1}时,array[index1]=array[index2]=array[indexMid],因此无法确定中间数字1是否属于第一个还是第二个递增数组,此时当两个指针指向的数字及中间的数字三者相同的时候,无法判断中间数字是位于哪个数组中,也就无法通过移动指针来缩小查找范围,因此不得不用顺序查找的方法

此题是二分查找的变形,因此要利用二分查找法实现O(logn)的查找。

 

以上是关于旋转数组的最小数字的主要内容,如果未能解决你的问题,请参考以下文章

《剑指offer》— JavaScript旋转数组的最小数字

旋转数组的最小数字

剑指 Offer 11. 旋转数组的最小数字 的详细题解

剑指offer旋转数组的最小数字

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

剑指OFFER旋转数组的最小数字