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);
}
}