开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情
描述
给定一个无重复元素的整数数组nums,请你找出其中没有出现的最小的正整数
进阶: 空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
数据范围:
-2^{31}\le nums[i] \le 2^{31}-1−231≤nums[i]≤231−1
0\le len(nums)\le5*10^50≤len(nums)≤5∗105
示例1
输入:
[1,0,2]
返回值:
3
示例2
输入:
[-2,3,4,1,5]
返回值:
2
示例3
输入:
[4,5,6,8,9]
返回值:
1
哈希表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
思路与具体做法
- 首先遍历整个数组,并用unordered_map标记该数字已出现
- 然后从1遍历到n,并在unordered_map查找该值是否出现,未出现则直接返回
- 若长度为n的数组里n个数字都出现了,则第n+1个数字一个未出现
代码实现
class Solution {
public:
int minNumberDisappeared(vector<int>& nums) {
int n = nums.size();
//遍历数组
for(int i = 0; i < n; i++)
//负数全部记为n+1
if(nums[i] <= 0)
nums[i] = n + 1;
for(int i = 0; i < n; i++)
//对于1-n中的数字
if(abs(nums[i]) <= n)
//这个数字的下标标记为负数
nums[abs(nums[i]) - 1] = -1 * abs(nums[abs(nums[i]) - 1]);
for(int i = 0; i < n; i++)
//找到第一个元素不为负数的下标
if(nums[i] > 0)
return i + 1;
return n + 1;
}
};