把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
解决步骤
首先进行鲁棒性,判断是否输入合法,数组不能为空,长度也不能为0
首先声明三个变量 lo hi mi
这三个变量代表着数组处理的位置
开始 末尾 中间
当索引号为lo的数据大于索引号为hi的数据是进行循环
当lo和hi相邻的时候 hi为所找的数据
mi为中间的元素
进行判断,无法正常循环的用遍历的方法进行找数据//lo mi hi所指的元相等
//遍历单独写一个函数,不然容易死循环
//这个函数有一个小优化,遍历不需要从第一个开始而是从lo到hi
如果mi所代表的数据大于等于lo所代表的数据
缩小范围处理
最后返回中间位置的数据
package com.helan.b;
public class RotatedArrayMin {
public static void main(String[] args) {
int a[]={1,1,0,1,1};
System.out.println(ArrayMin(a));
}
private static int ArrayMin(int[] a) {
if(a==null||a.length==0){
throw new RuntimeException("错误的输入!");
}//4,5,6,7,1,2
int lo=0;
int hi=a.length-1;
int mi=0;
while(a[lo]>=a[hi]){
if(hi-lo==1){
return a[hi];
}
mi=(lo+hi)>>1;
if(a[hi]==a[mi]&&a[lo]==a[mi]){
return Min(a,lo,hi);
}
if(a[mi]>=a[lo]){
lo=mi;
}else if(mi<=hi){
hi=mi;
}
}
return a[mi];
}
private static int Min(int[] a,int start,int end) {
int num=a[0];
for(int i=start;i<=end;i++){
if(num>a[i]){
num=a[i];
}
}
return num;
}
}