剑指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] 也可以
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)