也就是要将两个指针逐步向中间逼近,找到那个临界点(就是左边大,右边小的left和right),然后返回right。
public static int findMin2(int[] nums){ int left=0; int right=nums.length; int mid=0; while (nums[left]>=nums[right]){ if (left==right){ break; } if (right-left==1){ return nums[right]; } mid=(left+right)/2; if (nums[mid]>nums[left]){ left=mid; }else { right=mid; } } return nums[0]; }
这个解法的复杂度:O(nlogn).
还有个O(n)的解法:
public int findMin(int[] nums) { if(nums.length==0) return 0; for(int i=1;i<nums.length;++i){ if(nums[i]<nums[i-1]){ return nums[i]; } } return nums[0]; }