2022.6.6今天你刷题了吗
题目:
给定一个包含 [0, n]
中 n
个数的数组 nums
,找出 [0, n]
这个范围内没有出现在数组中的那个数。
分析:
一个数组,元素个数为 n,则得到一个0-n的连续递增数组,我们要找到该数组中没有的元素。例如
n=3,得到【0 1 2 3】,现在nums=【0 2 3】,则找到缺少的1
n=1,得到【0 1】,现在nums=【1】,则找到缺少的0
对于数组,哈希是个常用办法,思路是先通过n得到一个数组,把这些数字插入到map里面,并且记录每个数的次数,然后再把nums元素插入map里面,最后找到次数为1次的键值对,就可以得到结果
解析:
1.哈希
class Solution {
public:
int missingNumber(vector<int>& nums) {
unordered_map<int, int>map;
int n = nums.size();
for (int i = 0; i < n; i++)
{
map.insert(i, 1);
}
for (auto num : nums)
{
map[num]++;
}
for (auto num : map)
{
if (num.second == 1)
{
return num.first;
}
}
return 0;
}
};
2.暴力求解
我们还是利用n得到一个vector数组,并且由于这个nums大小一定比vec少1,因此在vec后面插入-1,然后排序好nums之后,一个一个对比值是否一样
class Solution {
public:
int missingNumber(vector<int>& nums) {
vector<int>vec;
sort(nums.begin(), nums.end());
nums.push_back(-1);
for (int i = 0; i <= nums.size(); ++i)
{
vec.push_back(i);
}
for (int j = 0; j <= nums.size(); ++j)
{
if (vec[j] != nums[j])
{
return vec[j];
}
}
return 0;
}
};
3暴力求解
这里根据数据的特殊性质,也就是下标和对应的值相等,因此判断这个关系就行
class Solution {
public:
int missingNumber(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
for (int i = 0; i < nums.size(); ++i)
{
if (nums[i] != i)
{
return i;
}
}
return n;
}
};
4.哈希进阶
之前的哈希,比较麻烦,现在我们考虑,把nums直接插入,然后去遍历一次0-n,看这个哈希表里面有没有,如果没有,就返回这个值
class Solution {
public:
int missingNumber(vector<int>& nums) {
unordered_map<int, int>map;
int res = 0;
for (auto num : nums)
{
map[num]++;
}
for (int i = 0; i <= nums.size(); i++)
{
if (!map.count(i))
{
res = i;
break;
}
}
return res;
}
};
5.高斯求和
由于可以把它当作一个等比数列,我们只需要按公式求和,然后用理论和减去当前和,就是这个值了
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = nums.size();
int sum = (n * (n + 1)) / 2;
int total = 0;
for (int i = 0; i < n; i++)
{
total = total + nums[i];
}
return sum - total;
}
};