当前位置: 代码迷 >> 综合 >> 【leetcode】剑指 Offer 11. 旋转数组的最小数字(xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof)(二分)[简单]
  详细解决方案

【leetcode】剑指 Offer 11. 旋转数组的最小数字(xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof)(二分)[简单]

热度:78   发布时间:2024-01-31 03:51:06.0

链接

https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/

耗时

解题:null min
题解:32 min

题意

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。

思路

没有想出 存在元素相等的 的情况下怎么实现这个二分,想了几种方法,交了 6 次,全有问题的,淦!!!

看了题解,相等的时候往前走一个就好了,这样不会舍弃任何一个区间还能缩小范围使得二分继续,因为中间值和右端点值相等所以也不会丢失最小值。淦,之前灵光一闪好像想到了,但忘了之后为什么没用。

剩下就很常规,用中间值和区间右端点值比较,如果中间值小说明右边部分可以忽略,最小值在左半部分,如果中间值大则说明左半部分可以忽略。

时间复杂度: O ( l o g n ) O(logn)

AC代码

class Solution {
public:int minArray(vector<int>& numbers) {int n = numbers.size();int s = 0, t = n-1;while(s < t) {int mid = s + ((t-s)>>1);if(numbers[mid] == numbers[t]) {t = t-1;}else if(numbers[mid] < numbers[t]) {t = mid;}else if(numbers[mid] > numbers[t]){s = mid+1;                }} return numbers[t];}
};
  相关解决方案