题目:假设按照升序排序的数组在预先未知的某个点上进行了旋转。比如数组[0,1,2,3,4,5,6,7]旋转为[4,5,6,7,0,1,2,3],要求找出最小元素。
public class SearchMin { public static int min(int nums[]){ int length=nums.length; int index1=0; int index2=length-1; int indexMid=index1; while (nums[index1]>=nums[index2]){ if (index2-index1==1){ indexMid=index2; break; } indexMid=(index1+index2)/2; if (nums[index1]==nums[index2]&&nums[indexMid]==nums[index1]){ return MinOrder(nums,index1,index2); } if (nums[indexMid]>=nums[index1]) index1=indexMid; else if(nums[indexMid]<=nums[index2]) index2=indexMid; } return nums[indexMid]; } public static int MinOrder(int numbers[],int index1,int index2){ int result=numbers[index1]; for (int i = index1+1; i <=index2 ; i++) { if (result>numbers[i]) result=numbers[i]; } return result; } public static void main(String[] args) { int[] numbers=new int[]{1,0,1,1,1}; System.out.println(min(numbers)); } }
上面一种是比较完善的,考虑到了元素重复的情况,下面一种的条件是元素不重复
public class FindMin { public static int findMin(int[] nums) { if (nums.length == 1 || nums[0] < nums[nums.length - 1]) { return nums[0]; } int lo = 0; int hi = nums.length - 1; while (lo <= hi) { int mid = (lo + hi) / 2; if (nums[mid] >= nums[0]) { lo = mid + 1; } else { hi = mid - 1; } } return nums[lo]; } public static void main(String[] args) { int nums[]=new int[]{3,4,5,1,2}; System.out.println(findMin(nums)); } }