LeetCode第41题:缺失的第一个正数(困难)

该博客介绍了LeetCode中难度为困难的第41题,题目要求在未排序的整数数组中找到缺失的第一个正整数。文章提供了两种解法,一种是先排序再比较,另一种是利用哈希表实现,揭示了该问题的挑战性和解决方案。
摘要由CSDN通过智能技术生成

LeetCode第41题:缺失的第一个正数(困难)

  • 题目:给定一个未排序的整数数组,找出其中没有出现的最小的正整数。
  • 解法一:先给数组排序,在逐个进行比较。
class Solution {
    public int firstMissingPositive(int[] nums) {
        Arrays.sort(nums);
        int len=nums.length;
        int j=1;
        if(len==0)  return j;;
        for(int i=0;i<len;){
            if(nums[i]>0){
                if(i>0 && nums[i]==nums[i-1]){
                    i++;
                }else if(nums[i]==j){
                    j++;
                    i++;
                }else{
                    break;
                }
            }else{
                i++;
            }
        }
        return j;
    }
}
  • 解法二:官方解法用了哈希,我终于知道这道题为什么是困难了,但是运算的结果好像也差不多。
class Solution {
  public int firstMissingPositive(int[] nums) {
    int n = nums.length;

    // 基本情况
    int contains = 0;
    for (int i = 0; i < n; i++)
      if (nums[i] == 1) {
        contains++;
        break;
      }

    if (contains == 0)
      return 1;

    // nums = [1]
    if (n == 1)
      return 2;

    // 用 1 替换负数,0,
    // 和大于 n 的数
    // 在转换以后,nums 只会包含
    // 正数
    for (int i = 0; i < n; i++)
      if ((nums[i] <= 0) || (nums[i] > n))
        nums[i] = 1;

    // 使用索引和数字符号作为检查器
    // 例如,如果 nums[1] 是负数表示在数组中出现了数字 `1`
    // 如果 nums[2] 是正数 表示数字 2 没有出现
    for (int i = 0; i < n; i++) {
      int a = Math.abs(nums[i]);
      // 如果发现了一个数字 a - 改变第 a 个元素的符号
      // 注意重复元素只需操作一次
      if (a == n)
        nums[0] = - Math.abs(nums[0]);
      else
        nums[a] = - Math.abs(nums[a]);
    }

    // 现在第一个正数的下标
    // 就是第一个缺失的数
    for (int i = 1; i < n; i++) {
      if (nums[i] > 0)
        return i;
    }

    if (nums[0] > 0)
      return n;

    return n + 1;
  }
}

作者:LeetCode
链接:https://leetcode-cn.com/problems/first-missing-positive/solution/que-shi-de-di-yi-ge-zheng-shu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值