题目地址:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof/
题目描述
一个长度为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
解题思路
二分查找:排序数组中的搜索问题,首先想到二分查找方法,通过分析题目,我们可以将数组nums分为两部分,即左子数组nums[i]=i,右子数组nums[i]!=i,而题目所求缺失的数字恰好是右子数组首元素对应的索引值。接下来,就是具体的循环二分查找,我们先求得nums中点值mid,当nums[mid]=mid时,则右子数组的首位元素一定在区间[mid+1,right]之间,此时,执行i=mid+1,否则,左子数组的末尾元素一定在区间[left,mid-1]之中,此时执行j=mid-1。
非二分查找:我们令数组nums的大小n=nums.size()。如果n没在nums中出现的话,那么对于所有的0<=i<nums.size(),有nums[i]==i,即索引i处放置数字i,此时所求的缺失数字就是n,即nums.size(),如果n出现在nums中(出现在nums的最后一个位置),则在nums最后位置的前面有nums[i]!=i出现,此时i就是缺失的数字。
程序源码
二分查找
class Solution { public: int missingNumber(vector<int>& nums) { if(nums.size() < 1) return 0; int left = 0, right = nums.size() - 1; while(left <= right) { int mid = left + (right - left) / 2; if(nums[mid] == mid) { left = mid + 1; } else { right = mid - 1; } } return left; } };
非二分法
class Solution { public: int missingNumber(vector<int>& nums) { if(nums.size() < 1) return 0; int loss_number = nums.size(); for(int i = 0; i < nums.size(); i++) { if(nums[i] != i) { loss_number = i; break; } } return loss_number; } };