题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素的位置。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。
思路:采用二分查找O(logn)比顺序遍历O(n)快。需要考虑相等数字的特殊情况,此时只能顺序遍历。
public int minNumReversing(int[] nums) { if (nums.length <= 1) return nums.length-1; int s=0, e=nums.length-1; while (e - s > 1) { int mid = s + (e - s) / 2; if (nums[mid] < nums[mid-1]) return mid; else if (nums[mid] > nums[mid-1]) e = mid - 1; else if (nums[mid] == nums[s] || nums[mid] == nums[e]) { int i=1; while (i < nums.length && nums[i] >= nums[i-1]) { i++; } return i; } } return nums[s]>nums[e] ? e : s; }