268. 缺失数字
题目描述
给定一个包含 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
class Solution {
public int missingNumber(int[] nums) {
int[] arr = new int[nums.length + 1];
for(int i=0; i<nums.length; i++) {
arr[nums[i]]++;
}
for(int i=0; i<arr.length; i++) {
if(arr[i] == 0) {
return i;
}
}
return 0;
}
}
时间复杂度是O(n),符合要求。但是空间复杂度是O(n),不符合要求。
思路2
等差数列求和公式:
和 = (首项 + 尾项) * 项数 / 2
缺失的数字是 (0…n)的和 - 数组值的和
实现2
class Solution {
public int missingNumber(int[] nums) {
int allSum = (0 + nums.length) * (nums.length + 1) / 2;
int curSum = 0;
for(int i=0; i<nums.length; i++) {
curSum = curSum + nums[i];
}
int res = allSum - curSum;
return res;
}
}
时间复杂度是O(n),空间复杂度是O(1),符合要求。