首页 > 其他分享 >41.缺失的第一个正数 (Hard)

41.缺失的第一个正数 (Hard)

时间:2023-06-13 16:48:36浏览次数:54  
标签:nums int Hard 示例 41 num 正数

问题描述

41. 缺失的第一个正数 (Hard)

给你一个未排序的整数数组 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 * 10⁵
  • -2³¹ <= nums[i] <= 2³¹ - 1

解题思路

标记

nums[i]数组上做标记,我们可以将nums数组中的负数都设为n + 1,令num = abs(nums[i]),然后将nums[num - 1]取反,最后遍历修改后的nums[i],如果都是负数,返回n + 1,否则返回碰到的第一个非负数的索引加一;

置换

如果nums[i] <= nums.size() && nums[i] > 0,那么就将它与nums[num[i] - 1]置换,为了防止死循环,还要判断nums[i] != nums[nums[i] - 1]

代码

标记

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int n = nums.size();
        for (int& num: nums) {
            if (num <= 0) {
                num = n + 1;
            }
        }
        for (int i = 0; i < n; ++i) {
            int num = abs(nums[i]);
            if (num <= n) {
                nums[num - 1] = -abs(nums[num - 1]);
            }
        }
        for (int i = 0; i < n; ++i) {
            if (nums[i] > 0) {
                return i + 1;
            }
        }
        return n + 1;
    }
};
// @lc code=end

置换

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        for (int i = 0; i < nums.size(); ++i) {
            while (nums[i] > 0 && nums[i] <= nums.size() && nums[i] != i + 1 && nums[i] != nums[nums[i] - 1]) {
                std::swap(nums[i], nums[nums[i] - 1]);
            }
        }
        for (int i = 0; i < nums.size(); ++i) {
            if (nums[i] != i + 1) {
                return i + 1;
            }
        }
        return nums.size() + 1;
    }
};

标签:nums,int,Hard,示例,41,num,正数
From: https://www.cnblogs.com/zwyyy456/p/17478034.html

相关文章

  • Apache Http Server 路径穿越漏洞复现(CVE-2021-41773)
    ApacheHttpServer路径穿越漏洞复现ApacheHttpServer路径穿越漏洞概述ApacheHttpServer简介ApacheHTTPServer(简称Apache)是Apache软件基金会的一个开放源码的网页服务器软件,可以在大多数电脑操作系统中运行。由于其跨平台和安全性,被广泛使用,是最流行的Web服务器......
  • 2646. 最小化旅行的价格总和 (Hard)
    问题描述2646.最小化旅行的价格总和(Hard)现有一棵无向、无根的树,树中有n个节点,按从0到n-1编号。给你一个整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[aᵢ,bᵢ]表示树中节点aᵢ和bᵢ之间存在一条边。每个节点都关联一个价格。给你一个......
  • send it failed() The virtual circuit was reset by the remote side executing a ha
    串口调试助手报错提示Thevirtualcircuitwasresetbytheremotesideexecutingahardorabortiveclose.forupdsocket,theremotehostwasunabletodeliverapreviouslysentUDPdategramandrespondedwithaportunreachableICMPpackettheapplicationsh......
  • win10系统开启同时多用户远程连接桌面,支持22H2,版本10.0.19041.2075
    1.打开远程桌面控制并开启多用户连接1)win+r打开运行窗口,输入gpedit.msc,进入“本地组策略编辑器”2)按以下步骤找到远程桌面会话主机:计算机配置-->管理模板-->Windows组件-->远程桌面服务-->远程桌面会话主机-->连接 3)编辑远程桌面会话主机连接 3.1)双击“允许用户通......
  • Codeforces Round #416 (Div. 2)-C. Vladik and Memorable Trip
    原题链接C.VladikandMemorableTriptimelimitpertestmemorylimitpertestinputoutputVladikoftentravelsbytrains.HerememberedsomeofhistripsespeciallywellandIwouldliketotellyouaboutone......
  • Codeforces Round #415 (Div. 2)-C. Do you want a date?
    原题链接C.Doyouwantadate?timelimitpertestmemorylimitpertestinputoutputn1 to n.Sothe i-thhackedcomputerislocatedatthepoint xi.Moreoverthecoordinatesofallcomputersaredistinct.L......
  • POJ 2352 HDU1541 Stars(树状数组)
    题意:二维平面给定n个点的坐标,然后要你输出每个点的“等级“。每个点的等级是它的左下放的点个数(包括正下放和正左方的点)。即要你输出对于每个点(x,y)来说,有多少点的坐标(xi,yi)满足xi<=x且yi<=y。思路:题目给出的坐标中已经是按y升序排列,那么其实只用考虑x轴,那么显然就是在前面的......
  • LG9410 机场修建
    和@ez_lcw胡出来的做法,不需要什么高级科技。先假设没有\(1\)操作,变成初始给定若干连通块。该问题容易归约为矩阵乘法,\(A\)矩阵每行是一种颜色,\(B\)矩阵每列是一个操作。所以可以直接思考\(O(n\sqrtn)\)的做法。通过枚举做法,发现可以序列分块。对于每个块,维护散块加的答......
  • ObjectARX 2014 项目升级到高版本vs2017出现提示平台集v141未安装
    ARX2014项目升级到vs2017的时候提示平台集未安装。解决方式:在vcproj文件中,添加相应的平台集。v141类似截图......
  • Luogu P4159 [SCOI2009] 迷路
    [SCOI2009]迷路题目背景windy在有向图中迷路了。题目描述该有向图有\(n\)个节点,节点从\(1\)至\(n\)编号,windy从节点\(1\)出发,他必须恰好在\(t\)时刻到达节点\(n\)。现在给出该有向图,你能告诉windy总共有多少种不同的路径吗?答案对\(2009\)取模。注意:windy......