关联LeetCode题号41
本题特点
本题思路
- 找缺失的最小正数,看举例说明缺失的正数,一种情况是连续的最小的正数,一种是缺失连续但不是最小的正数
- 验证数组内数组是否连续,可以通过 nums[i]+1 是否存nums组成的哈希表,如果nums[i]+1 <= 0 不符合正数的条件,轻松解决,详情看Java写法
- 题目要求时间复杂度O(n)并且只使用常数级别额外空间的解决方案 ,就上难度了,hah Python 数组可以直接提供包含方法,哈哈哈,但是实际上还是通过哈希,不过我是菜鸡 能AC就行
- Python写法是好早之前写的了,排序之后,如果当前值和下标一致说明是不缺少的,不一致为缺少,忘记当时从哪学习来的,不过时间复杂度不满足O(n),因为排序了
Python写法
def firstMissingPositive(self, nums: List[int]) -> int:
# 优先把重复的,小于0的值过滤掉
nums = list(filter(lambda x: x>0, list(set(nums))))
if len(nums) == 0:
return 1
# 排序
nums.sort()
# 值和下标值比较,一致说明不缺少,不一致说明缺少
for i in range(1, len(nums)+1):
if i != nums[i-1]:
return i
# 补充缺少的值是数组最大值+1的情况
return nums[len(nums)-1]+1
Java写法
package leetcode;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* File Description: FirstMissingPositive_41
* Author:
* Date: 2025/4/30 09:39
*/
public class FirstMissingPositive_41 {
public int firstMissingPositive(int[] nums){
Map<Integer, Integer> hashmap = new HashMap<>();
int res = Integer.MAX_VALUE;
for (int each: nums){
hashmap.put(each, hashmap.getOrDefault(each, 0)+1);
}
if (hashmap.containsKey(1)){
for (int i = 0; i < nums.length; i++){
if (hashmap.containsKey(nums[i] + 1)) continue;
else {
// 不包含nums[i]+1 说明该值符合缺少条件
// 判断是不是正数
if (nums[i]+1 <= 0) continue;
else {
// 判断是不是最小
res = Math.min(res, nums[i]+1);
}
}
}
return res;
}else{
// 不包含1,肯定缺少的最小正整数就是1
return 1;
}
}
@Test
public void TestFirstMissingPositive(){
int[] nums = {7,8,9,11,12};
int res = firstMissingPositive(nums);
System.out.println(res);
}
}