package com.exe2.offer;
/**
* 【题目】输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
* 【思路】:①正常情况下可利用二分法进行查找;
* ②特殊情况,要用顺序查找。
* @author WGS
*
*/
public class SearchMinNumInSpinArray {
public int getMinNum(int[] arrs){
if(arrs==null||arrs.length<=0){
try {
throw new Exception("Invalid arrays");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//定义指针
int preIndex=0;
int endIndex=arrs.length-1;
int midIndex=preIndex;//此处不宜直接设为0,因为当判断到要求将数组前0个元素旋转时,第一个元素 即为最小值(不一定是0)
//默认是递增的排序
while(arrs[preIndex]>=arrs[endIndex]){
//二分法
midIndex=(preIndex+endIndex)/2;
//若出现前后中指针所指数组皆相同时则无法使用二分法,要用顺序查找法
if(arrs[preIndex]==arrs[endIndex]&&arrs[midIndex]==arrs[endIndex]){
return minInOrder(arrs,preIndex,endIndex);
}
if(arrs[midIndex]>=arrs[preIndex]){
preIndex=midIndex;
}else if(arrs[midIndex]<=arrs[preIndex]){
endIndex=midIndex;
}
//判断下是否前后指针相遇,相遇后指针所指即为最小值
if(endIndex-preIndex==1){
midIndex=endIndex;
break;
}
}
return arrs[midIndex];
}
//顺序查找法
public int minInOrder(int[] arrs,int preIndex,int endIndex){
int result=arrs[preIndex];
for(int i=preIndex+1;i<=endIndex;i++){
if(result>arrs[i]){
result=arrs[i];
}
}
return result;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* 当数组是3,2,3,3,3时查找到的最小值是3 不对 因为中间值是3 无法判断,要使用顺序查找
*/
int[] arrs=new int[]{1,0,1,1,1};//新建一个旋转后的数组3,4,5,1,2
SearchMinNumInSpinArray s=new SearchMinNumInSpinArray();
int min=s.getMinNum(arrs);
System.out.println("最小值是"+min);
}
}
【数组2】-旋转数组的最小值
最新推荐文章于 2021-03-29 09:23:39 发布