把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
本题目比较简单,先叙述我个人的思路:
由于数组本身是一个递增结构,原先在前面较小的数值,被放到了数组后面,如果从前往后遍历,遇到一个比前一个数小的数值,那么说明找到了最小值。
注意只需要遍历到数组倒数第二个元素,若遍历到了最后,便不是旋转数组。
注意前几位数值相等的情况,比如2,2,2,0,1。
class Solution { public int minArray(int[] numbers) { for(int i = 0; i < numbers.length-1;i++){ if(numbers[i] > numbers[i+1]) return numbers[i+1]; } return numbers[0]; } }
时间复杂度为O(n)。
二分查找方法:经典算法,从左右两端查找。快,
class Solution { public int minArray(int[] numbers) { int low = 0; int high = numbers.length - 1; while (low < high) { int pivot = low + (high - low) / 2; if (numbers[pivot] < numbers[high]) { high = pivot; } else if (numbers[pivot] > numbers[high]) { low = pivot + 1; } else { high -= 1; } } return numbers[low]; } }
时间复杂度为O(logn)。