一 题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
二 题目分析
- 该数组原来是一个单调递增的数组,将前n个数字旋转到后面,输出最小的数字,假如数组大小为0的话,则返回0。
- 直接遍历循环输出最小的,这样的方法是最暴力的(不提倡)
- 借鉴二分法的思维方式
数组: 3 4 5 1 2 3 ---1--- ---2--- 1. 原数组旋转后,必然是两个有序的递增序列 2. 假如当前中间的元素大于最右面的元素,则证明现在处于2位置 left = mid + 1 3. 假如当前中间的元素小于最右面的元素,则证明现在处于1位置 right = mid 4. 假如当前中间的元素等于最右面的元素,则证明元素中出现了重复的,这时候需要挨个判断,直接right--
三 代码(Java)
import java.util.ArrayList; public class Solution { public int minNumberInRotateArray(int[] array) { int len = array.length; if (len == 0) { return 0; } else { int left = 0; int right = len - 1; while (left < right) { int mid = (left + right) / 2; if (array[mid] < array[right]) { right = mid; } else if (array[mid] > array[right]) { left = mid + 1; }else { right--; } } return array[left]; } } }