剑指offer 22. 旋转数组的最小数字- java实现
原题链接
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个升序的数组的一个旋转,输出旋转数组的最小元素。
例如数组 {3,4,5,1,2} 为 {1,2,3,4,5} 的一个旋转,该数组的最小值为 1。
数组可能包含重复项。
注意:数组内所含元素非负,若数组大小为 0,请返回 −1。
数据范围
数组长度 [0,90]。
代码案例:输入:nums = [2, 2, 2, 0, 1]
输出:0
题解 - O(n)

这道题采用二分法查找 但是右半部分不满足二分 二分法的前提是数组必须是有序的 所以要把黑色的部分去掉 左半部分满足二分查找 而找到最小值的求解就是求右半部分的最小值 mid 在最小值的右边 所以二分模板选择不加1 的
所以首先要取消黑色部分那相等的部分
另外 要考虑特殊情况 就是完全单调的情况下 也就是右半部分在左半部分的上面
class Solution {
public int findMin(int[] nums) {
int n = nums.length -1;
if(n < 0 ) return -1;
while(n > 0&&nums[0] == nums[n] ) n--;//先删掉右边横着的部分
if(nums[n] >= nums[0]) return nums[0];//特殊情况
int l = 0; int r = n ;
while( l < r ){
int mid = l + r >> 1 ;
if( nums[0] > nums[mid]) r = mid ;
else l = mid + 1 ;
}
return nums[l] ;//nums[r] 也可以
}
}

浙公网安备 33010602011771号