题目描述
题干:
给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。
示例1:
输入:nums = [3,0,1]
输出:2
解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。
示例2:
输入:nums = [0,1]
输出:2
解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。
题解思路
找到这个数组中从0开始到数组长度中没有元素,长期看官方题解的我第一个念头我就想到了,他第一个方法肯定是排序
数组排序后,至于怎么找到缺失的那个元素就很多方法了,我这里直接用for循环里的i与之比较,当然你也可以通过做差等其他方法
这道题很灵活,其他方法也多,哈希表、数学方法都可以,我这里代码再给出一个位运算的方法,因为效率较高
正确代码
//排序
public int missingNumber(int[] nums) {
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
if (i != nums[i]) {
return i;
}
}
return nums.length;
}
//位运算
public int missingNumber1(int[] nums) {
//这里初值设为数组长度和排序中最后返回数组长度一个道理
//都是考虑到循环最后一个元素的特殊情况
int len = nums.length;
for (int i = 0; i < nums.length; i++) {
len ^= i ^ nums[i];
}
return len;
}
总结
以后这种能和循环元素挂钩的题目都可以用类似的思路解决,排序虽然是简单的方法,但是调用排序方法复杂度过高
其实找出这种特殊元素的题目哈希表都是不错的选择,所以自己也应该手写熟练一下,其他方法可以自行去官方题解观看
如果文章存在什么问题或者有更好的题解,欢迎评论区斧正和评论,各自努力,你我最高处见