LeetCode41.缺失的第一个数

【LeetCode】41.缺失的第一个数

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
进阶:你可以实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案吗?

思路:哈希表

对于一个长度为N的数组,其中没有出现的最小正整数只能在[1,N+1]中,因为如果[1,N]都出现了,那么答案是N+1,否则答案就是[1,N]中没有出现的最小正整数。将所有在[1,N]范围内的数放在哈希表,就可得到最终答案。

算法过程:

  • 将数组中所有小于等于0的数修改为N+1;
  • 遍历数组中的每一个数x,可能已经被打了标记(表示为负号),因此原本对应的数为|x|(||为绝对值符号),如果|x|属于[1,N]范围,那么就给数组中的第|x|-1个位置的数添加一个负号。
  • 遍历完成后,如果数组中的每一个数都是负数,那么答案是N+1,否则答案是第一个正数的位置加1.

代码:

class Solution {
    // 哈希表法
    public int firstMissingPositive(int[] nums) {
        // 首先将数组中所有负数变为N+1(N为数组的长度)
        int len = nums.length;
        for(int i=0; i<nums.length; i++){
            if(nums[i] <= 0){
                nums[i] = len+1;
            }
        }
        // 遍历数组,如果x在[1,N]范围内,则打上标记,本题【标记】表示为【负号】
        for(int i=0; i<nums.length; i++){
            int num = Math.abs(nums[i]);
            if(num <= len){
                nums[num-1] = -Math.abs(nums[num-1]);
            }
        }

        // 遍历数组,第一个正数位置为最终答案,如果全为负数,则答案为N+1;
        for(int i=0; i<nums.length; i++){
            if(nums[i] > 0)
                return i+1;
        }
        return len+1;
    }
}
全部评论

相关推荐

bg27强双非本,目前在学习golang后端gin框架部分,在b站找了一个轮子项目敲了一下,技术栈是gin&nbsp;+&nbsp;gorm&nbsp;+&nbsp;mysql&nbsp;+&nbsp;redis。我目前的想法是这一个月学习408和go八股以及刷算法然后在12月找个寒假实习然后大三下开始准备考研。我是考研意愿比较强烈,想问一下我是应该all&nbsp;in其中一个方向吗,我感觉我实习对我考研来说也是没什么帮助的好像。
牛客28967172...:毕业工作,考研,考公是完全不同的方向。 99%的人拼尽全力也只能把一个做好(能做好都已经是佼佼者了,比如进进大厂,考985或者考公) 如果你确定要考研可以不用学任何就业技术框架,也不用实习经验,刷题背知识点就行,但注意必须考92院校起步,因为这个年代双非硕毕业后完全不如双非本(互联网行业),可以说双非硕在互联网就业完全是负收益
投递哔哩哔哩等公司10个岗位
点赞 评论 收藏
分享
09-28 22:01
已编辑
广西科技大学 IT技术支持
合适才能收到offe...:找桌面运维?
点赞 评论 收藏
分享
11-04 10:30
已编辑
门头沟学院 研发工程师
开心小狗🐶:“直接说答案”
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务