细说这题,其实有多种办法,这里讲两种,多的有兴趣可以自己想想。
暴力
别问,问就是只要没超,都可以暴力,更何况是这种时间复杂度O(N)就可以解决的暴力。
因为每一个数字都对应的是它的下标,如果有一个不是,那它就是缺失的数字。
直接看代码:
class Solution { public: int missingNumber(vector<int>& nums) { for(int i = 0;i<nums.size();i++) { if(nums[i] != i) return i; } return nums.size(); } };
如果一次找完了都没找到 i ,说明缺是就是最后一个元素,最后一个元素就是这个数组的长度。
二分
我们可以通过二分来快速找到这个缺失的位置的附近,然后进行简单的判断来输出返回值。
class Solution { public: int missingNumber(vector<int>& nums) { int left = 0; int right = nums.size()-1; while(left < right) { int mid = (left+right)/2; if(nums[mid] > mid) right = mid; else left = mid+1; } return nums[left]==left?left+1:nums[left]-1; } };
如果这个位置相等,就说明这是缺失数字的左边,如果不相等,说明这是缺失数字的右边。