剑指 Offer 11.旋转数组的最小数字

题目描述

 

 

 

解法

二分查找

思路:

设i为左界,j为右界,中点为mid;

将number[mid] 与number[j]进行比较,会出现一下情况:

  • number[mid] < number[j]时,说明number[mid] 是最小值右侧元素,令j = mid;
  • number[mid] > number[j]时,说明number[mid] 是最小值左侧元素,令i = mid + 1;
  • number[mid] = number[j]时,由于重复元素的存在,我们并不能确定 numbers[mid]究竟在最小值的左侧还是右侧,由于它们的值相同,所以无论numbers[j]是不是最小值,都有一个它的替代品numbers[mid],因此我们可以忽略二分查找区间的右端点。
复制代码
class Solution {
public:
    int minArray(vector<int>& numbers) {
        int i = 0, j = numbers.size() - 1;
        while(i < j){
            int mid = i + (j - i) / 2;
            if(numbers[mid] < numbers[j]){
                j = mid;
            }
            else if(numbers[mid] > numbers[j]){
                i = mid + 1;
            }
            else{
                j--;
            }
        }
        return numbers[i];    
    }
};
复制代码

 

注意:为什么是low + (high - low) / 2 而不是 (high + low) // 2的原因因为low+high在low和high特别大的时候可能会造成溢出,使用减法避免了溢出发生

 

参考:https://leetcode.cn/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/solution/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-by-leetcode-s/

posted @   盏茶  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示