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

题目描述

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

示例 1:

1
2
输入: [0,1,3]
输出: 2

示例 2:

1
2
输入: [0,1,2,3,4,5,6,7,9]
输出: 8

限制:

$1 <= 数组长度 <= 10000$


算法

(二分) $O(logn)$

已知每个数字在 0 ~ n - 1 之间,但里面少一个数,观察数组的特点可以发现少的那个数一定是第一个大于当前下标的数,即 nums[i] > i,因此可以通过二分 $[0, n - 1]$ 区间寻找答案。

如果二分没有找到答案那么说明缺少的那个数就是 n - 1。

注意:分析的时候长度是 n - 1,代码实现 n 代表的就是数组的长度。

时间复杂度

$O(logn)$

空间复杂度

$O(1)$

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = nums.size(); // n = 5, n - 1= 4;
int l = 0, r = n;
while (l < r) {
int mid = (l + r) >> 1;
if (nums[mid] > mid) r = mid;
else l = mid + 1;
}
if (l == n) return n;
return l;
}
};
Author: tonngw
Link: https://tonngw.com/2022/07/09/剑指 Offer/剑指 Offer 53 - II. 0~n-1中缺失的数字/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.