題目回憶
給定一個包含 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;
}
}