LeetCode 41题:缺失的第一个正数

目录

题目

思路

代码


题目

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

示例 1:

复制代码
输入:nums = [1,2,0]
输出:3

示例 2:

复制代码
输入:nums = [3,4,-1,1]
输出:2

示例 3:

复制代码
输入:nums = [7,8,9,11,12]
输出:1

提示:

  • 1 <= nums.length <= 5 * 105
  • -231 <= nums[i] <= 231 - 1

思路

想要实现题目要求的时空限制,可以利用哈希表。

根据题目分析,我们只需要考虑在 1,numsize 范围内的数据,如果数据都不在该范围内,则应该返回 1。构建哈希表的哈希方法是:该范围内数的地址 = 数值减一,然后将该地址标记,标记方法为取负,在此之前,需要将所有小于等于0的数换为 numsize+1。

标记之后遍历数组,出现的第一个正数的下标加1便是结果。

代码

cs 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int firstMissingPositive(int *nums, int numsSize);

int main()
{
    int size = 2;
    int nums[4] = {2, 1};
    int res = firstMissingPositive(nums, size);
    printf("%d", res);
    return 0;
}

int firstMissingPositive(int *nums, int numsSize)
{
    for (int i = 0; i < numsSize; i++)
    {
        if (nums[i] <= 0)
        {
            nums[i] = numsSize + 1;
        }
    }
    for (int i = 0; i < numsSize; i++)
    {
        int t = fabs(nums[i]);
        if (t < numsSize + 1 && nums[t - 1] > 0)
        {
            nums[t - 1] = -nums[t - 1];
        }
    }
    int i;
    for (i = 0; i < numsSize; i++)
    {
        if (nums[i] >= 0)
        {
            break;
        }
    }
    return i + 1;
}
相关推荐
杜 硕14 小时前
快速排序02
算法·排序算法
careathers14 小时前
【数据结构】二叉树拓展
数据结构·算法
java_nnnn14 小时前
LeetCode刷题滑动窗口(长度最小的子数组)
算法·leetcode·职场和发展
@atweiwei14 小时前
训练 AI 大模型系列之 LoRA:不动模型本体,靠一条低秩旁路改专长(附完整手算算例)
人工智能·算法·ai·语言模型·rag
yi01114 小时前
DAY27: LeetCode 110. 平衡二叉树 | 在递归中判断是否平衡
人工智能·笔记·python·算法·leetcode·二叉树·递归
96245615 小时前
餐饮 SaaS 优惠券系统架构演进(七)营销定价引擎设计:活动、会员价、优惠券、买赠如何在同一 PriceQuote 中可解释地组合
java·运维·算法
m0_5474866615 小时前
《数据结构:基于C语言的描述》全套PPT课件2026
c语言·数据结构
xuxigifxfh15 小时前
牛客:HJ21 简单密码
java·开发语言·算法
qq_4086068615 小时前
确界的倒数性质证明
学习·算法
小蒋观天下15 小时前
【安防AI工程实战二】AI摄像头帧率抖动根治:ISP曝光时序与AI推理时序冲突深度定位
人工智能·深度学习·算法·安全·机器学习·ai大模型