给出一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。
案例 1
输入: [3,0,1]
输出: 2
案例 2
输入: [9,6,4,2,3,5,7,0,1]
输出: 8
注意事项:
您的算法应该以线性复杂度运行。你能否仅使用恒定的额外空间复杂度来实现它?
详见:https://leetcode.com/problems/missing-number/description/
Java实现:
方法一:
class Solution { public int missingNumber(int[] nums) { int res=nums.length; int i=0; for(int num:nums){ res^=num; res^=i; ++i; } return res; } }
方法二:
class Solution { public int missingNumber(int[] nums) { int n=nums.length; int sum=0; for(int num:nums){ sum+=num; } return (int)(0.5*n*(n+1)-sum); } }
方法三:
用二分查找法算出中间元素的下标,然后用元素值和下标值之间做对比,如果元素值大于下标值,则说明缺失的数字在左边,此时将r赋为m,反之则将l赋为m+1。排序的时间复杂度都不止O(n),但是在面试的时候,有可能数组就是排好序的,那么此时用二分查找法肯定要优于上面两种方法。
class Solution { public int missingNumber(int[] nums) { Arrays.sort(nums); int l=0; int r=nums.length; while(l<r){ int m=(l+r)>>1; if(nums[m]>m){ r=m; }else{ l=m+1; } } return r; } }
参考:https://www.cnblogs.com/grandyang/p/4756677.html