旋转数组的最小数字

题目描述

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

出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。

可以利用二分法查找,当start<=mid的时候,则最小值应当在mid和end之间,否则应该在start和mid之间。

另外,如果start==mid==end,则无法判断最小值在哪个区间,就只有顺序查找了。

 

public int minNumberInRotateArray(int [] array) {
		    if(array.length<=0){
					return 0;
				}else if(array[0]<array[array.length-1]){
					return array[0];
				}
				return divide(array,0,array.length-1);
		    }
		    
		    private int divide(int[] array,int start,int end){
				if(end-start==1){
					return array[end];
				}else{
					int mid=(start+end)/2;
					
					if(array[start]==array[end]&&array[start]==array[mid]){//无法确定最小值在哪个区间,只能顺序查找
						return minInorder(array);
					}
					
					if(array[start]<=array[mid]){
						return divide(array,mid,end);
					}else{
						return divide(array,start,mid);
					}
				}
			}
			
			private int minInorder(int [] array){
				int min=array[0];
				for(int i=0;i<array.length;i++){
					if(min>array[i]){
						min=array[i];
					}
				}
				return min;
			}
posted @ 2015-12-29 15:11  黄大仙爱编程  阅读(122)  评论(0编辑  收藏  举报