关联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,肯定缺少的最小正整数就是1return 1;}}@Testpublic void TestFirstMissingPositive(){int[] nums = {7,8,9,11,12};int res = firstMissingPositive(nums);System.out.println(res);}
}