前言
hash赋能可以为后面的工作大大减少搜索的时间,可用hash数组、hashSet、hashMap、原地数组hash。
一、缺失的第一个正数
二、hash赋能
1、hashSet
public int firstMissingPositive(int[] nums) {
Set<Integer> hash = new HashSet<>();
for (int num : nums) hash.add(num);
int len = nums.length;
for (int i = 1; i <= len; i++) if (!hash.contains(i)) return i;
return len + 1;
}
2、原地数组hash
public int firstMissingPositive2(int[] nums) {
int len = nums.length;
for (int i = 0; i < len; ) {
if (nums[i] > 0 && nums[i] <= len && i != nums[i] - 1 && nums[nums[i] - 1] != nums[i]) {
int t = nums[nums[i] - 1];
nums[nums[i] - 1] = nums[i];
nums[i] = t;
} else ++i;
}
for (int i = 0; i < len; i++) if (i != nums[i] - 1) return i + 1;
return len + 1;
}
总结
1)hash赋能,尤其注意隐式hash赋能–原地数组hash。
参考文献
[1] LeetCode 缺失的第一个正数
|