遇到有序数组的查找问题,优先考虑的就是时间复杂度为log(n)的二分查找
那么针对这道题目,根据对其特点的分析,确定了将中间元素和最左最右元素分别比较,以缩小范围的方法。
如果最左元素比中间元素大,那么最小的元素,一定位于此二者中间,则right = mid;
如4,5,1,2,3
如果最右元素比中间元素小,那么最小的元素,一定位于此二者之间,则left = mid + 1;
如3,4,5,1,2
import java.util.*; import java.util.ArrayList; public class Solution { public int minNumberInRotateArray(int [] array) { if (array.length == 0) { return 0; } int left = 0, right = array.length - 1; while (left < right) { int mid = left + (right - left) / 2; if (array[mid] > array[right]) { left = mid + 1; } else if (array[mid] < array[left]) { right = mid; } else { // 相等的情况,只能一步一步缩小,因为无法确定在哪个范围内,只能left++或right-- // 但若处在一个递增序列,左边的肯定是当前最小的,所以不能left++; right--; } } return array[left]; } }