【缺失一个正数】
题目连接
回顾知识
(1)哈希,需要考虑数组的大小 n 和模的大小 mod。
(2)因为如果不进行模运算的话数组的大小会越界,如果存放的数值范围小的话可以不进行模运算。哈希用法很简单,有关的博客很多,不多赘述。
(3)另一种做法,进阶的哈希用法,就是自己定义哈希的存取规则。(也就是本题力扣视频中的用法【题解视频】)
解题思路
法1 普通哈希:
哈希的一般做法。
法2 原地哈希:
(1)将数组 nums[i] 存放在 nums[nums[i] - 1] 处。
(2)全部存放完,注意while的使用,直到符合条件或者是遇到范围以外的数,终止。
(3)视频中的解释很详细,举例模拟一下就清晰了。
代码详解
法1 C:
int firstMissingPositive(int* a, int n){
int hash[500010];
int mod = 500007;
memset(hash,0,sizeof(hash));
int i,j;
for (i = 0; i < n; i++) {
if(a[i]>=0) hash[a[i] % mod] = 1;
}
int ans = 0;
for (j = 1; j <= n+1; j++) {
if (hash[j] == 0) break;
}
return ans;
}
法2 Java:
class Solution {
public int firstMissingPositive(int[] nums) {
int len = nums.length;
for(int i = 0; i < len; i++){
while(nums[i] >= 1 && nums[i] <= len && nums[nums[i] - 1] !=nums[i]) {
swap(nums, i, nums[i] - 1);
}
}
for(int i = 0; i < len; i++) {
if(nums[i] != i + 1) {
return i + 1;
}
}
return len + 1;
}
private void swap(int[] nums, int i1, int i2) {
int temp = nums[i1];
nums[i1] = nums[i2];
nums[i2] = temp;
}
}
【过啦】!