算法:旋转数组的最小数字

问题

  • 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
    给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为
    [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。  
    注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。

解决

// 1、遍历查找
class Solution {
    public int minArray(int[] numbers) {        
        int len1=numbers.length; 
        if(len1==1) return numbers[0];
        for(int i=0;i<len1-1;i++){
            if(numbers[i]>numbers[i+1]){
                return numbers[i+1];
            }
        }
        return numbers[0];
    }
}
//2、二分查找
class Solution{
    public int minArray(int[] numbers){
        int left=0,right=numbers.length-1;  //建立数组左右指针
        int mid;
        while(left<right){
            mid=(left+right)/2;
            if(numbers[mid]<numbers[right])  //如果中间数小于右边数,那目标值一定是在mid左边或者mid本身
            {
                right=mid;
            }else if(numbers[mid]>numbers[right]){//如果中间数大于右边数,那目标值一定是在mid右边
                left=mid+1;
            }else{          //如果mid==right,无法确定目标值在那边,那么right--,缩小范围
                right--;
            }
        }
        return numbers[left];
    }
}

总结

  1. 第一种情况的时间复杂度O(N),空间复杂度O(1)
  2. 二分查找复杂度分析
posted @   new_monkey  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示