题目:41. 缺失的第一个正数
思路:哈希
- 可以新建一个哈希表,键是数组中出现的数组,值是
bool
。然后从1
到n
遍历数字,如果哈希表中没有该数字,那么该数字就是要求的数字;如果都有,就返回n+1
。 - 不新建哈希表,以原来的数组为哈希,我们把数字存到其对应的索引,即
1->0, 2->1……
。我们遍历数组,如果数字的值num
在[1, n]
(左闭右闭)区间里,并且数组num-1
的索引处存的不是num
,我们就交换二者的位置。最后再遍历数组,找出第一个数字与索引不匹配的就是要求的数字;如果找不到就返回n+1
。
代码:
新建哈希:
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
Map<Integer, Boolean> map = new HashMap<>(n);
for (int num : nums) {
map.put(num, true);
}
for (int i = 1; i <= n; i ++) {
if (!map.containsKey(i)) {
return i;
}
}
return n + 1;
}
}
原地哈希:
class Solution {
public int firstMissingPositive(int[] nums) {
int n = nums.length;
int i = 0;
while (i < n) {
while (nums[i] >= 1 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {
int temp = nums[i];
int index = nums[i] - 1;
nums[i] = nums[index];
nums[index] = temp;
}
i ++;
}
for (int j = 0; j < n; j ++) {
if (j+1 != nums[j]) {
return j + 1;
}
}
return n + 1;
}
}