package
com.ytx.Search;
/**
* 在旋转数组中找到最小的数字
* 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
* 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
* {1,2,3,4,5}
->
{3,4,5,1,2}
* 特例:
把排序数组的前面的0个元素搬到最后面,即排序数组本身。
* 还要考虑多个重复数字的情况如:
* {0,1,1,1,1,}
->
{1,0,1,1,1}或{1,1,1,0,1}
*
@author
yuantian xin
*
*/
public
class
SearchMin_inRotateArray {
public
int
findMin(int[]
nums) {
int
len
= nums.length;
if(nums
==
null ||
len <= 0) {
System.out.println("数组未初始化");
System.exit(-1);
}
int
low
= 0;
int
high
= len
- 1;
int
mid
= low
;
while(nums[low]
>= nums[high]) {
if((high
-
low) == 1) {
mid
=
high;
break;
}
mid
= (low
+
high) /2;
//如果高指针,低指针和中间指针指向的数字相等,直接顺序查找
if(nums[low]==nums[high]
&& nums[low]==nums[mid])
{
return
orderSearch(nums,low,high);
}
if(nums[mid]
>= nums[low]) {
low
=
mid;
}else
if(nums[mid]
<=nums[high]){
high
=
mid;
}
}
return
nums[mid];
}
//直接顺序查找
public
int
orderSearch(int[]
nums,
int
low,
int high) {
int
min
= nums[low];
for(int
i
= low;
i
<=high;
i++) {
if(min
>
nums[i])
min
=
nums[i];
}
return
min;
}
public
static
void main(String[]
args) {
int[]
data
= {1,1,1,0,1};
SearchMin_inRotateArray
ob
= new
SearchMin_inRotateArray();
int
minNumber
= ob.findMin(data);
System.out.println(minNumber);
}
}