题目回忆
给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。
示例 1:
输入: [3,0,1]
输出: 2
示例 2:
输入: [9,6,4,2,3,5,7,0,1]
输出: 8
算法应具有线性时间复杂度。考虑只使用额外常数空间来实现。
解题思路
- 思路1:数学方法,简单粗暴
找缺失的数,那我把1,2,3,···,n的累加和求出来,再把数组的累加和求出来,做个差就好了; - 思路2:关系判断
判断下标1~n的元素是否等于其前一个元素值+1,不是就说明缺失了前一个元素值+1所代表的这个数字; - 思路3:借助哈希Set
先把数组中的元素存入HashSet中,再遍历整数序列0,1,2,···,n,当存在某个元素item不被HashSet包含时,就返回这个元素item。
代码实现(Java)
import java.util.HashSet;
import java.util.Set;
/**
* @author : flower48237
* @2020/3/18 21:41
* @title : LeetCode精选TOP面试题268.缺失数字
*/
public class Solution {
public int missingNumber(int[] nums) {
// 法 1
int sum = 0;
int stdsum = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
stdsum += i + 1;
}
return stdsum - sum;
// 法 2
Arrays.sort(nums);
// 判断 n 是否出现在末位
if (nums[nums.length-1] != nums.length) {
return nums.length;
}
// 判断 0 是否出现在首位
else if (nums[0] != 0) {
return 0;
}
// 此时缺失的数字一定在 (0, n) 中
for (int i = 1; i < nums.length; i++) {
if (nums[i] != nums[i-1] + 1) {
return nums[i-1] + 1;
}
}
// 未缺失任何数字(保证函数有返回值)
return -1;
// 法 3
Set<Integer> set = new HashSet<Integer>();
for (int n : nums){
set.add(n);
}
for (int i = 0; i <= nums.length; i++){
if (!set.contains(i)){
return i;
}
}
return -1;
}
}