牛客题霸NC71旋转数组的最小数字Java题解
旋转数组的最小数字
http://www.nowcoder.com/questionTerminal/9f3231a991af4f55b95579b44b7a01ba
牛客题霸NC71旋转数组的最小数字Java题解
https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=117&&tqId=34993&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking
方法:二分法
解题思路: ①当 array[mid] > array[j] 时: mid一定在左排序数组中,即旋转点x一定在[mid+1,j]闭区间内,因此执行i=mid+1
②当 array[mid] < array[j] 时:mid 一定在右排序数组中,即旋转点x一定在[i,mid]闭区间内,因此执行j=mid
③当 array[mid] = array[j] 时:无法判断 mid 在哪个排序数组中,可直接放弃二分查找,而使用线性查找替代。
import java.util.ArrayList; public class Solution { public int minNumberInRotateArray(int [] array) { int i = 0; int j = array.length-1; while(i<j){ int mid = (i+j)/2; if(array[mid]>array[j]){ //当 array[mid] > array[j] 时: mid一定在左排序数组中,即旋转点x一定在[mid+1,j]闭区间内,因此执行i=mid+1 i=mid+1; }else if(array[mid]<array[j]){ //当 array[mid] < array[j] 时:mid 一定在右排序数组中,即旋转点x一定在[i,mid]闭区间内,因此执行j=mid j=mid }else{ //当 array[mid] = array[j] 时:无法判断 mid 在哪个排序数组中,可直接放弃二分查找,而使用线性查找替代 int res = array[i]; for(int k=i;k<=j;k++){ if(array[k]<res){ res = array[k]; } } return res; } } return array[i]; } }