首页 > 其他分享 >剑指 Offer 11.旋转数组的最小数字

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

时间:2023-03-13 21:24:24浏览次数:51  
标签:11 shu Offer number mid high numbers 数组 low

题目描述

 

 

 

解法

二分查找

思路:

设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/

标签:11,shu,Offer,number,mid,high,numbers,数组,low
From: https://www.cnblogs.com/zc-030/p/17212908.html

相关文章