您的位置:首页 > 其它

旋转数组的最小元素

2017-04-11 10:24 162 查看

比如数组[3,4,5,1,2就是已排序数组[1,2,3,4,5]的一个旋转数组。找出最小元素使用二分法,复杂度最小,为O(logn)。

旋转数组有以下三种情况

(1)最小值在首部,如[1,2,3,4,5]

(2)最小值不在首部,如[3,4,5,1,2]

(3)无法二分查找的特例,如[1,1,0,1,1,1,1,1],该数组使用二分法无法确定最小值在分界线的左侧还是右侧。此时只能使用遍历数组来查找

 

代码:

/**
* Created by wuchao on 17-4-11.
*/
import java.util.*;
public class test {
public static int array[] = {1,1,0,1,1,1,1};
public static void main(String[] args) {

findMin(array);
System.out.println(findMin(array));
}
public static int findMin(int[] array){
int index1=0;
int index2=array.length-1;
int indexMin = 0;
//情况1,如果第一个元素大于等于最后一个元素,说明最小值不处在数组首部
while(array[index1]>=array[index2]){
if(index2-index1==1){
return array[index2];
}
int index = (index1+index2)/2;
//情况3,如果array[index1],array[index].array[index2]相等,此时二分法不起效
if(array[index1]==array[index] && array[index2]==array[index]){
int min = array[index1];
for(int i=index1;i<=index2;i++){
if(min>array[i]) min=array[i];
}
return min;
}
if(array[index]>=array[index1]){
index1=index;
}else if(array[index]<=array[index2]){
index2=index;
}

return array[index2];
}
//情况2,反之,最小值处在首部,直接返回首部元素
return array[index1];
}
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: