题解 | #缺失的第一个正整数#
缺失的第一个正整数
https://www.nowcoder.com/practice/50ec6a5b0e4e45348544348278cdcee5
思路一
- 先排序
- 之后遍历数组,比较数组中相邻2个元素的差值,差值大于1就判断是否为正确答案;
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ public int minNumberDisappeared (int[] nums) { // write code here Arrays.sort(nums); // 排序 if(nums[0] > 1){ // 第一个数据就大于1 return 1; } for(int i=0; i < nums.length - 1; ++i){ if(nums[i + 1] - nums[i] > 1){ // 相邻数据间距大于1 if(nums[i] <= 0 && nums[i+1] > 1){ // 前一个数小于等于0,后一个数大于1 return 1; } else if(nums[i] > 0){ // 2数都是正整数 return nums[i] + 1; } } } int last = nums[nums.length - 1]; // 原数组最后一个元素 return last > 0 ? last + 1 : 1; } }
思路二
- 不排序,使用哈希表,实现O(1)的查找效率
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ public int minNumberDisappeared (int[] nums) { // write code here HashSet<Integer> set = new HashSet<>(); // 将数组中元素全部存入Hash集合 for(int i = 0; i < nums.length; ++i){ set.add(nums[i]); } // 从正整数1开始,找到第一个不在HashSet中的正整数 int res = 1; while(set.contains(res)){ // 不包含则退出 res++; } return res; } }