持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
剑指 Offer 53 - II. 0~n-1中缺失的数字
一、题目描述:
一个长度为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
限制:
1 <= 数组长度 <= 10000
来源:力扣(LeetCode) 链接:leetcode.cn/problems/qu… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
这部分可以写写:
-
这道题考察了什么思想?你的思路是什么?
这道题目我的思路很简单,就是0-n-1中抽n-1个数,我们只需要对n-1个数进行排序,然后看哪个数是第一个下标与值不相等的数,这个下标就是我们要获取的值。不过,如果一直遍历到底都相等,并不代表没有缺失,这时候我们考虑值为n-1的数缺失。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
class Solution {
public int missingNumber(int[] nums) {
Set<Integer> set = new HashSet<Integer>();
for (int num : nums) {
set.add(num);
}
int n = nums.length + 1;
for (int i = 0; i < n - 1; i++) {
if (!set.contains(i)) {
return i;
}
}
return n - 1;
}
}
作者:stormsunshine
链接:https://leetcode.cn/problems/que-shi-de-shu-zi-lcof/solution/by-stormsunshine-f5m2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
接下来大佬的解法令我叹为观止,我真的不可能想到这种解法!太强了!
class Solution {
public int missingNumber(int[] nums) {
int xor = 0;
for (int num : nums) {
xor ^= num;
}
int n = nums.length + 1;
for (int i = 0; i < n; i++) {
xor ^= i;
}
return xor;
}
}
作者:stormsunshine
链接:https://leetcode.cn/problems/que-shi-de-shu-zi-lcof/solution/by-stormsunshine-f5m2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
三、AC 代码:
class Solution:
def missingNumber(self, nums: List[int]) -> int:
nums.sort()
for i, num in enumerate(nums):
if num != i:
return i
return len(nums)
四、总结:
如果你还有更多的思考、分析、总结,通通都加上来吧~
剑指 Offer 53 - II. 0~n-1中缺失的数字
简简单单的一道题目,大佬给出了五种解法,而我只能想到最简单的那种,看来简单的题目也有很多高效的解法,我们还是得多做题,多见识啊!
这里是小伞,一个努力刷题的程序员,希望你能够喜欢。
写作模板来源:
作者:掘金酱 链接:juejin.cn/post/706970…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。