【4.5日题解】——41. 缺失的第一个正数

【4.5日题解】——41. 缺失的第一个正数,第1张

☘前言☘

今天的题目也许有点难了,但是吧。


也还好感觉。


希望有想要提高的同学跟我们一起来刷题0.0
4.5日每日一题——缺失的第一个正数

🧑🏻作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)
⏳全文大约阅读时间: 20min


全文目录
  • ☘前言☘
    • 解题思路1
    • 解题思路2
    • 解题思路3
  • 📑写在最后


41. 缺失的第一个正数

解题思路1

简单的思路就是要求O(n)就直接hash表,你能奈我何。


为了压缩一点复杂度,我们采用位hash表,就是一位代表一个元素。


unsigned char hash[70005];
int firstMissingPositive(int* nums, int numsSize){
    for(int i = 0;i < numsSize/8 + 1;++i){
        hash[i] = 0;
    }
    for(int i = 0;i < numsSize;++i)
        if(nums[i] > 0 && nums[i] < 500005) hash[nums[i]/8] |= 1<<(nums[i]%8);
    for(int i = 1;i < 500005;++i)
        if(!(hash[i/8] & 1<<(i%8)))    return i;
    return 0;
}

这结果还不香?????


解题思路2

学习学习官方的解题思路,也是hash,但是为了压缩空间复杂度,采用了一种妙蛙种子的hash表。


哈哈哈 其实就是给位置打标签,如果当前的元素比n+1小就给[x-1]位置打标签,同时为了不影响对应位置的信息,打标签的方式是吧对应的元素进行翻转,也就是把正的变成负的,同时为了防止之前就是负数元素的影响,将负元素全部改成n+1也就是可能的最大值。


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 n = abs(nums[i]);
        if(n <= numsSize)
            nums[n-1] = -abs(nums[n-1]); //翻转
    }
    for(int i = 0;i < numsSize;++i)
        if(nums[i] > 0) return i+1;
    return numsSize + 1;
}

就这就这????空间复杂度比我直接hash还高,请问是代码段比我长么?????


解题思路3

还是官方题解,这个置换方式看起来比hash优雅多了,就是每次将当前位置的元素和正确位置的元素进行置换,最后位置元素不正常的元素就是结果。



int firstMissingPositive(int* nums, int numsSize) {
    for (int i = 0; i < numsSize; ++i)
        while (nums[i] > 0 && nums[i] <= numsSize && nums[nums[i] - 1] != nums[i]) {//置换
            int t = nums[nums[i] - 1];
            nums[nums[i] - 1] = nums[i], nums[i] = t;
        }
    for (int i = 0; i < numsSize; ++i) 
        if (nums[i] != i + 1)  return i + 1;//返回结果
   
    return numsSize + 1;
}


感觉也不过如此啊。



📑写在最后

感觉力扣有bug,显示的内存和时间复杂度却决于当前的网络情况,我在网络拥塞的情况下会发现时间高很多,就离谱呗?大家加油!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/567464.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存