268缺失数字-数组
描述
给定一个包含 0, 1, 2, ..., n
中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。
实例
输入: [3,0,1]
输出: 2
输入: [9,6,4,2,3,5,7,0,1]
输出: 8
说明
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?
题解
本题最简单的思路就是直接把所有已有的元素都放到一个地方,再一一检查.下面是我的代码
static public int missingNumber(int[] nums) {
HashSet<Integer> hashSet = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
hashSet.add(nums[i]);
}
for (int i = 0; i <= nums.length; i++) {
if (hashSet.add(i)){
return i;
}
}
return 0;
}
不过使用到了HashSet,速度不够快,如果使用数组更好.
class Solution {
public int missingNumber(int[] nums) {
if(nums == null || nums.length == 0) {
return 0;
}
int length = nums.length;
int[] newNums = new int[length + 1];
for(int num : nums) {
newNums[num] = 1;
}
for(int i = 0; i < newNums.length; i++) {
if(newNums[i] == 0) {
return i;
}
}
return 0;
}
}
上述两个代码都满足了O(n)
的时间复杂度,但是对于常数级别的额外空间没有满足.有一种解法是将上述所有元素求和,再与sum(0~n)
进行比较,差值就是缺少的数值…效率又高,空间又省…
int missingNumber(vector<int>& nums) {
int sum = 0, n = nums.size();
for (auto &a : nums) {
sum += a;
}
return 0.5 * n * (n + 1) - sum;
}
第一第二种是常规做法,第三种不强求,但需要有这样的比较意识.