C++实现LeetCode(41.首个缺失的正数)

 更新时间:2021年07月15日 11:33:10   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(41.首个缺失的正数),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 41. First Missing Positive 首个缺失的正数

Given an unsorted integer array, find the smallest missing positive integer.

Example 1:

Input: [1,2,0]
Output: 3

Example 2:

Input: [3,4,-1,1]
Output: 2

Example 3:

Input: [7,8,9,11,12]
Output: 1

Note:

Your algorithm should run in O(n) time and uses constant extra space.

这道题让我们找缺失的首个正数,由于限定了 O(n) 的时间,所以一般的排序方法都不能用,最开始博主没有看到还限制了空间复杂度,所以想到了用 HashSet 来解,这个思路很简单,把所有的数都存入 HashSet 中,然后循环从1开始递增找数字,哪个数字找不到就返回哪个数字,如果一直找到了最大的数字(这里是 nums 数组的长度),则加1后返回结果 res,参见代码如下:

解法一:

// NOT constant space
class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        unordered_set<int> st(nums.begin(), nums.end());
        int res = 1, n = nums.size();
        while (res <= n) {
            if (!st.count(res)) return res;
            ++res;
        }
        return res;
    }
};

但是上面的解法不是 O(1) 的空间复杂度,所以需要另想一种解法,既然不能建立新的数组,那么只能覆盖原有数组,思路是把1放在数组第一个位置 nums[0],2放在第二个位置 nums[1],即需要把 nums[i] 放在 nums[nums[i] - 1]上,遍历整个数组,如果 nums[i] != i + 1, 而 nums[i] 为整数且不大于n,另外 nums[i] 不等于 nums[nums[i] - 1] 的话,将两者位置调换,如果不满足上述条件直接跳过,最后再遍历一遍数组,如果对应位置上的数不正确则返回正确的数,参见代码如下:

解法二:

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[i], nums[nums[i] - 1]);
            }
        }
        for (int i = 0; i < n; ++i) {
            if (nums[i] != i + 1) return i + 1;
        }
        return n + 1;
    }
};

到此这篇关于C++实现LeetCode(41.首个缺失的正数)的文章就介绍到这了,更多相关C++实现首个缺失的正数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • qt获取当前时间(QDateTime、QTime、QDate)

    qt获取当前时间(QDateTime、QTime、QDate)

    本文主要介绍了qt获取当前时间(QDateTime、QTime、QDate),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • C语言实现通用数据结构之通用链表

    C语言实现通用数据结构之通用链表

    这篇文章主要为大家详细介绍了c语言实现通用数据结构之通用链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C++和python实现单链表及其原理

    C++和python实现单链表及其原理

    这篇文章主要介绍了C++和python实现单链表及其原理,单链表是链表家族中的一员,每个节点依旧由数据域(data)和指针域(next)组成,链表的具体概念下面文章将详细介绍,需要的小伙伴可以参考一下
    2022-03-03
  • c++ 梅森数源码示例解析

    c++ 梅森数源码示例解析

    这篇文章主要为大家介绍了c++ 梅森数源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • C++ Qt QColorDialog使用方法

    C++ Qt QColorDialog使用方法

    本文主要介绍了C++ Qt QColorDialog使用方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • c++中cin/cout与scanf/printf的区别比较

    c++中cin/cout与scanf/printf的区别比较

    这篇文章主要介绍了c++中cin/cout与scanf/printf的区别比较,需要的朋友可以参考下
    2017-06-06
  • c++结合opencv如何实现读取多张图片并显示

    c++结合opencv如何实现读取多张图片并显示

    这篇文章主要介绍了c++结合opencv如何实现读取多张图片并显示问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++程序代码优化的方法实例大全

    C++程序代码优化的方法实例大全

    优化是一个非常大的主题,本文并不是去深入探讨性能分析理论,算法的效率,这篇文章主要给大家介绍了关于C++代码优化的相关资料,需要的朋友可以参考下
    2022-03-03
  • C语言读取文件流的相关函数用法简介

    C语言读取文件流的相关函数用法简介

    这篇文章主要介绍了C语言读取文件流的相关函数用法简介,包括fread()函数和feof()函数的使用,需要的朋友可以参考下
    2015-08-08
  • C++冒泡排序与选择排序详解

    C++冒泡排序与选择排序详解

    大家好,本篇文章主要讲的是C++冒泡排序与选择排序详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12

最新评论