剑指offer:旋转数组的最小数字

这篇博客探讨了如何在旋转的非递减数组中找到最小值。博主首先提出直接排序的简单解决方案,然后从学习角度出发,详细分析了利用二分查找法的思路。在二分查找过程中,博主区分了两种情况:数组部分有序和完全无序,并给出了相应的边界条件判断。最后,博主提供了完整的二分查找算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
1.没什么好说的直接排序,输出最小值就完了。暴力直接,有api不用是傻瓜。

  public int minNumberInRotateArray(int[] array) {
        //直接排序
        if (array.length == 0) return 0;
        Arrays.sort(array);
        return array[0];
    }

2.站在学习的角度上
理解题意:非递减数组的一个旋转数组,作为参数。
那么传入的参数格式要么是:
1.递增数组经过数组旋转之后得到的
在这里插入图片描述
2.不递增也不递减
在这里插入图片描述
第一种情况:
这种偏向于有序的数组,找值的题一般是利用二分思想,但是对于二分来说,第一他没有target,第二数组并不是真正的有序。逐一分析。
确定target,一般是端点,要么是左端点,要么是右端点。左端点和mid去比较,可以发现好像并没有什么用,如果mid>low,那么可以说明mid前面的值是想要的嘛?好像不行。右端点,如果是右端点,好像还可以,因为此时mid位置元素和low位置,或者high位置比较。

1.mid>low元素,说明mid处在递增数组中,那么low=mid+1
在这里插入图片描述

2.mid<high元素,说明mid处在旋转后的数组中high=mid
在这里插入图片描述

3.还有一种情况就是mid<=low,而且mid>high
eg:
在这里插入图片描述

这个时候说明来到了旋转产生的边界处,只需要low++即可。
第二种情况:
在这里插入图片描述

根据上边的,mid>=low,而且mid!<high,无法判断在那个区间内,此时low++,但是下次的mid会等于
在这里插入图片描述
跳过正确的0值,所以这种情况下,如果low的值,小于high的值,直接返回即可。

public static int minNumberInRotateArray1(int[] array) {
        if (array.length == 0) return 0;
             //二分法 没有target 因为是非递减数组的旋转数组,那么构造一定是类似与{3, 4, 5, 1, 2};或者{1,0,1,1,1}
        //则一定要比较的是mid在那个区间,就是找到旋转的边界
        int right = array.length - 1;
        int left = 0;
        int mid = 0;
        while (right > left) {
            if (array[left]<array[right]){
                return array[left];
            }

            mid=(left+right)/2;
            if (array[mid] < array[right]) {
                right = mid;
            } else if (array[mid] > array[left]) {
                left = mid + 1;
            } else {
                left++;
            }


        }
        return array[left];
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值