首页 > 其他分享 >缺失的第一个正数

缺失的第一个正数

时间:2023-04-09 19:55:39浏览次数:38  
标签:遍历 第一个 标记 nums 数组 正数 缺失 答案

缺失的第一个正数

对于一个长度为 N 的数组,其中没有出现的最小正整数只能在[1,N+1]中。这是因为如果[1,N]都出现了,那么答案是N+1,否则答案是[1,N]中没有出现的最小正整数。

这样一来,我们将所有在[1,N]范围内的数放入哈希表,也可以得到最终的答案。而给定的数组恰好长度为N

这让我们有了一种将数组设计成哈希表的思路:我们对数组进行遍历,对于遍历到的数x,如果它在[1,N]的范围内,那么就将数组中的第x−1个位置(注意:数组下标从0开始)打上「标记」。在遍历结束之后,如果所有的位置都被打上了标记,那么答案是N+1,否则答案是最小的没有打上标记的位置加1

那么如何设计这个「标记」呢?由于数组中的数没有任何限制,因此这并不是一件容易的事情。但我们可以继续利用上面的提到的性质:由于我们只在意[1,N]中的数,因此我们可以先对数组进行遍历,把不在[1,N]范围内的数修改成任意一个大于N的数(例如 N+1)。这样一来,数组中的所有数就都是正数了,因此我们就可以将「标记」表示为「负号」。

算法的流程如下:

  • 我们将数组中所有小于等于0的数修改为N+1;

  • 我们遍历数组中的每一个数x,它可能已经被打了标记,因此原本对应的数为∣x∣。如果∣x∣∈[1,N],那么我们给数组中的第∣x∣−1个位置的数添加一个负号。注意如果它已经有负号,不需要重复添加;

  • 在遍历完成之后,如果数组中的每一个数都是负数,那么答案是N+1,否则答案是第一个正数的位置加1

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int n = nums.size();
        for(auto& 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;
    }
};

标签:遍历,第一个,标记,nums,数组,正数,缺失,答案
From: https://www.cnblogs.com/bothgone/p/17300901.html

相关文章

  • LeetCode习题——在排序数组中查找元素的第一个和最后一个位置(二分查找)
    在排序数组中查找元素的第一个和最后一个位置力扣链接:在排序数组中查找元素的第一个和最后一个位置题目给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。你......
  • 第一个C语言项目
    VS2022怎么写呢?1.创建一个项目——新建--空项目2.创建一个源文件——xxxx.c--源文件 xxxx.h--头文件   添加源文件,文件名后缀.c3.写代码——写出主函数(main函数)c语言是从主函数的第一行开始执行的4.编译代码——编译+链接+运行代码快捷键ctrl+f5......
  • 学习STM32的第一个外设GPIO(2)——GPIO的输出
    【1】GPIO位结构  【1-1】输入部分为了保护IO引脚,上下各接一个保护二极管,用于限幅输入电压。上面二极管接VDD(3.3V),下面的二极管接VSS(0V)。如果输入电压比3.3V还要高,上面二极管导通,输入电压产生的电流会直接流入VDD而不是内部电流。如果输入电压比0V还要低,相对于VSS电......
  • 数组里有n个元素,取第一个元素和最后一个元素时间差会很大吗?
    其实呢,不要被这个所迷惑了,数组里面呢无论有多少个元素,它都是通过key值去精确查找哈希表的过程,所以呢,它们所消耗的时间呢,基本就是差不多的,当然,可能会有一些差异,但这个差异的话,可以忽略不计。......
  • QT5 | 第一个QT程序
    QT|第一个QT程序1.运行QTCreateor更换QTCreater主题2.新建工程选择"文件(F)->新建文件或者项目(N)..."。GUI设计工具3.运行效果4.问题问题1:单独点击"hello.exe"可执行文件,报错:解决办法:无法启动此程序,因为计算机中缺少Qt5Core.dll。因为该可执行程序下缺少依赖的库,或者是正确的环境......
  • mule anything studio 第一个应用
    添加组件服务组件httplistenerhttplistenerconfig添加请求组件resquesttest.json[{"ID":1,"code1":"ER","code2":"38sd","takeOffDate":"2016/03/20......
  • 我的第一个项目(九) :飞机大战Vue版本塞到主页
    好家伙, 这是未进行分包的vue版本的飞机大战效果如下:  这里说明一下,大概使用逻辑是提供一个<div>然后在这<div>中渲染游戏 游戏主界面代码如下:1<template>2<div>3<h1>欢迎来到主页面</h1>4<divref="stage"></div>5</div......
  • 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提示:......
  • 我的第一个win32汇编程序
    .386.ModelFlat,stdcalloptioncasemap:none;头文件包含includewindows.incincludekernel32.incincludelibkernel32.libincludeuser32.incincludelibuser32.libincludegdi32.incincludelibgdi32.lib;数据段定义.datahInstancedd......
  • Java 缺失的特性:扩展方法
    作者:周密(之叶)什么是扩展方法扩展方法,就是能够向现有类型直接“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改现有类型。调用扩展方法的时候,与调用在类型中实际定义的方法相比没有明显的差异。为什么需要扩展方法考虑要实现这样的功能:从Redis取出包含多个商......