题目简述
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
题解示例
示例 1:
输入: [0,1,3]
输出: 2
示例 2:
输入: [0,1,2,3,4,5,6,7,9]
输出: 8
数据范围
1 <= 数组长度 <= 10000
标记难度
通过次数:126,612
提交次数:284,562
通过率:44.5%
问题简析
对该数组进行二分查找即可。
若计算得到的中值与数组中值相等,则缺失的数字在右区间中;
若计算得到的中值与数组中值不相等,则缺失的数字在左区间中;
最简单的方法便是遍历数组,如此则未能将数组有序的条件合理利用,其时间复杂度也相对较大。
python3代码
class Solution:
def missingNumber(self, nums: List[int]) -> int:
i, j = 0, len(nums)-1
while i <= j:
mid = (i+j) // 2
if nums[mid] == mid:
i = mid+1
else:
j = mid-1
return i
C语言代码
int missingNumber(int* nums, int numsSize){
int left = 0, right = numsSize-1, mid;
while (left <= right)
{
mid = left + (right - left) / 2;
if (nums[mid] != mid)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return left;
}
C++代码(Copy)
class Solution {
public:
int missingNumber(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left <= right)
{
int mid = (left + right) >> 1;
if (nums[mid] == mid) left = mid + 1;
else right = mid - 1;
}
return left; //注意最后left不等于right,只能返回left
}
};
大佬专属代码
return (len(nums)+1)*len(nums)/2 -sum(nums)
敲黑板!!!
有序数组二分法!!!有序数组二分法!!!有序数组二分法!!!(重要的事情说三遍)