一个长度为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
思路分析:
方法一:遍历法
最开始第一个想到的就是逐个遍历,返回与下标不相同的元素即可。时间复杂度为。
方法二:二分查找
对于有序的数组, 都应该想到用二分法搜索。时间复杂度为。
考点主要还是二分法,不能一味的去遍历,所有的题都拿来遍历,你的offer很可能就遍历到别人手上了。
代码实现:
遍历
public int missingNumber(int[] nums) {
int cnt = 0;
for (int i = 0;i <= nums.length - 1;i++){
if (cnt != nums[i])return cnt;
else cnt++;
}
return cnt;
}
二分查找
public int missingNumber(int[] nums) {
int left = 0,right = nums.length - 1;
while (left <= right){
int m = (left + right) / 2;
if(nums[m] == m)left = m + 1;
else right = m - 1;
}
return left;
}
提交结果
遍历
122 / 122 个通过测试用例
状态:通过
执行用时: 0 ms
内存消耗: 42.4 MB
提交时间:21 分钟前
二分查找
122 / 122 个通过测试用例
状态:通过
执行用时: 0 ms
内存消耗: 42.3 MB
提交时间:11 分钟前