11. 旋转数组的最小数字
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
解题思路
将旋转数组对半分可以得到一个包含最小元素的新旋转数组,以及一个非递减排序的数组。新的旋转数组的数组元素是原数组的一半,从而将问题规模减少了一半,这种折半性质的算法的时间复杂度为 O(logN)(为了方便,这里将 log2N 写为 logN)。
分析:
1、交换前:单调递增,但是可能存在相同数的情况

2、交换后:整个数组从左至右分成两段,最初和最末可能出现相同的值

3、可以从后往前删掉与nums[0]相同的数据,得到后半部分单调
考虑两种情况:

4、二分数组下标
数组[0-n], l=0,r=n mid=l+r>>1;
if(nums[mid]>nums[0]) 证明当前的mid在上图的左边,应该选择右边取最小值
1 | class Solution { |
java 实现
[leetcode题解](旋转数组的最小数字 - 旋转数组的最小数字 - 力扣(LeetCode) (leetcode-cn.com))
1 | class Solution { |