题目
【中等,原地哈希】BM53 缺失的第一个正整数
描述
给定一个无重复元素的整数数组nums,请你找出其中没有出现的最小的正整数
进阶: 空间复杂度 O(1),时间复杂度 O(n)
思路
- 设数组长度为n,则数组中缺失最小正整数的范围在 [1,n+1] 中
- 题目要求空间复杂度为O(1),使用原地哈希:
- 遍历一遍数组,将负数置为 n+1
- 遍历一边数组,当遇到一个元素的绝对值不超过n时,则表示这个元素是1~n中的元素,将其对应下标处的元素修改为负值,即出现过的的正整数位置的标记为负号
- 遍历一遍数组,若某个下标处元素值为正数,则该下标值为缺失的第一个给正整数
基本思想是下标为正整数序列,元素符号为标记
代码
- 原地哈希
class Solution {
public:
int minNumberDisappeared(vector<int>& nums) {
int n = nums.size();
for (int i = 0; i < n; i++) {
if (nums[i] <= 0)
nums[i] = n + 1;
}
for (int i = 0; i < n; i++) {
if (abs(nums[i]) <= n) {
nums[abs(nums[i]) - 1] *= -1;
}
}
for (int i = 0; i < n; i++) {
if (nums[i] > 0)
return i + 1;
}
return n + 1;
}
};
- 哈希表
class Solution {
public:
int minNumberDisappeared(vector<int>& nums) {
// write code here
unordered_map<int,int> map;
for(auto it:nums){
map[it] += 1;
}
int ret = 1;
while(map.find(ret) != map.end()){
ret++;
}
return ret;
}
};