【题解】力扣41.缺失的第一个正数

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

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

看到时间复杂度为O(n),立刻想到:最后应该是要遍历一次一个数组或者表之类的东西来得到答案,且在这个数组(表)的每个位置都只是看一下“值”就走,不能逗留

看到空间复杂度为常数级别,排除“将数组中的元素一个个加进哈希表”的想法

那怎么办?

只能对原数组修改,最后看的应该也是修改后的原数组。

可是怎么修改呢?我第一个想法是遍历每一个元素a,如果1<=a<=n,就在数组下标[a-1]处+1。可是数组是int数组,每个位置只能存一个值。所以这个想法破产了

不过我们要记录的只是这个整数 “有没有出现过” ,而不是 “出现过几次” 。那负号是否可行?第一次遇到这个元素时,给nums[a-1]加一个负号,之后再遇到就不动了,最后看出现正数的最小下标是多少就得到答案了。

可是nums[a]可能本来就是正数啊。没关系,把负数变成n+1就行,反正不管碰到负数,还是n+1,都不会加负号。

int firstMissPositive(vector<int>& nums){
    int n=nums.size();
    for(int& num:nums){//这里是引用,所以修改num,就相当于修改nums的这一个元素了
        if(num<=0){
            num=n+1;
        }
    }
    for(int i=0;i<n;++i){
        int num=abs(nums[i]);
        if(num<=n){//也就是看原来的那个元素是不是1~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;
}

官方题解里面,还给了另一种解法:把所有1~n的整数a移到nums[a-1]上,最后只要遍历一下数组,找出第一个不符合 “值是下标+1” 的元素 i 就行

若nums[a-1]已经是a,那就别动了

因为最多n个1~n的整数,所以最多交换n次

力扣代码如下:

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int n = nums.size();
        for (int i = 0; i < n; ++i) {
            while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] != nums[i]) {
                swap(nums[nums[i] - 1], nums[i]);//nums[i]是a,它应该在nums[a-1]处
            }
        }
        for (int i = 0; i < n; ++i) {
            if (nums[i] != i + 1) {
                return i + 1;
            }
        }
        return n + 1;
    }
};

  • 31
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
《计算机操作系统(第4版)》学习指导与题解 含实验.pdf是一本关于计算机操作系统的学习指导和题解的电子书。这本书主要针对操作系统这个重要的计算机课程内容进行了详细的解释和讲解,对读者学习操作系统具有很大的帮助。 这本电子书的特点是结合了学习指导和题解,旨在帮助读者更好地理解和掌握操作系统的知识。书中通过讲解操作系统的基本概念、原理和技术,引导读者深入理解操作系统的工作原理和实现方法。同时,书中还提供了一些习题和实验,帮助读者巩固所学的知识,提升操作系统的实践能力。 这本电子书的内容丰富全面,涵盖了操作系统的各个方面。包括进程管理、内存管理、文件系统、输入输出管理等内容。每个章节都有详细的解释和示例,配有相关的习题和实验,可以帮助读者更好地理解和运用所学的知识。 对于计算机专业的学生和从事计算机相关工作的技术人员来说,这本电子书是一本很好的学习资料。通过学习这本书,读者可以全面了解和掌握操作系统的知识,提高自己的技能水平。同时,这本电子书还适合作为操作系统相关课程的参考教材,帮助教师更好地教授操作系统的知识。 总之,《计算机操作系统(第4版)》学习指导与题解 含实验.pdf 是一本内容丰富、有助于学习操作系统的电子书,对于学习操作系统或从事计算机相关工作的人士来说都是一本很有价值的学习资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值