七周打卡剑指offer《旋转数组中最小的数字》
Posted JunMain
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七周打卡剑指offer《旋转数组中最小的数字》相关的知识,希望对你有一定的参考价值。
旋转数组中最小的数字
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个升序的数组的一个旋转,输出旋转数组的最小元素。
例如数组 {3,4,5,1,2} 为 {1,2,3,4,5} 的一个旋转,该数组的最小值为 1。
数组可能包含重复项。
注意:
数组内所含元素非负,若数组大小为 0,请返回 −1。
样例
输入:nums = [2, 2, 2, 0, 1]
输出:0
题解:
二分
根据二分的本质我们发现除了最后没几个数字和nums[0]相同其他都满足二段性
所以先把后面相同的删除
左边:nums[i] >= nums[0]
右边:nums[i] < nums[0]
真命题在后 用到第二个板子
考虑几种特殊情况:完全递增, 完全相同, 空集
代码:
class Solution {
public:
int findMin(vector<int>& nums) {
int n = nums.size()-1;
if (n < 0) return -1;
while (n >= 0 && nums[n] == nums[0]) n--;
if (nums[n] > nums[0]) return nums[0];
int l = 0, r = n;
while (l < r){
int mid = l + r >> 1;
if (nums[mid] < nums[0]) r = mid;
else l = mid + 1;
}
return nums[l];
}
};
以上是关于七周打卡剑指offer《旋转数组中最小的数字》的主要内容,如果未能解决你的问题,请参考以下文章