数组中的元素正常是0,1,2,n。 数组中元素有n-1个元素,查找缺少的那个元素。
例如:
Input: [9,6,4,2,3,5,7,0,1]
Output: 8 (数组中缺少的元素是8)
难度:【easy】
这道题我想出了三种方法:
第一种方法:对原数组进行排序,之后对比下标和该下标对应的元素值,如果不同,那么下标就是缺少的元素。
class Solution {
public:
int missingNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] != i) {
return i;
}
}
return nums.size();
}
};
第二种方法:借助辅助数组,大小为nums.size()+1,遍历原数组在辅助数组中进行标记出现记为1。在遍历一遍辅助数组,找到为0的元素对应的下标就是缺少的元素。
class Solution {
public:
int missingNumber(vector<int>& nums) {
//int *tmp = new int[nums.size()];
int tmp[nums.size() + 1] = {0};
for (int i = 0; i < nums.size(); ++i) {
tmp[nums[i]] = 1;
}
for (int i = 0; i < nums.size(); ++i) {
if (tmp[i] == 0) {
return i;
}
}
return nums.size();
}
};
第三种方法:即不需要辅助空间,也不用破坏原有数组元素顺序,并且只遍历一遍数组即可。求数组中如果不缺少元素的总和,和 缺少一个元素的总和,相减,就是缺少的元素。
class Solution {
public:
int missingNumber(vector<int>& nums) {
long sum = (1 + nums.size()) * nums.size() / 2;
long cur_sum = 0;
for (int i = 0; i < nums.size(); ++i) {
cur_sum += nums[i];
}
return sum - cur_sum;
}
};