普通数组-----缺失的第一个正数

🔥个人主页: Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至

题目解析

这道题要求在一个未排序的整数数组中,找出没有出现的最小正整数,并且需要满足两个严格的条件:

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)(常数级额外空间)

直接排序或使用哈希表的方法,要么时间复杂度不达标,要么空间复杂度不达标。因此,我们需要采用一种巧妙的原地置换策略,利用数组本身作为哈希表来解决问题。

核心思路

对于一个长度为 n 的数组,缺失的最小正整数只可能在 [1, n+1] 范围内:

  • 如果 [1, n] 内的所有整数都出现了,那么缺失的就是 n+1。
  • 否则,缺失的就是 [1, n] 中第一个未出现的数。

我们的目标就是把数组中所有在 [1, n] 范围内的数,放到它们 "应该" 在的位置上,即数值 k 应该放在索引 k-1 的位置上。这样,我们只需要遍历一次数组,找到第一个位置 i 上的数不等于 i+1,i+1 就是我们要找的答案。

详细步骤

  1. 原地置换 :遍历数组,对于每个元素 nums[i],如果它是一个在 [1, n] 范围内的正整数,并且它没有在正确的位置 nums[i]-1 上,就将它与 nums[nums[i]-1] 交换,直到当前位置的元素正确或超出范围为止。
  2. 查找缺失 :再次遍历数组,检查每个位置 i。如果 nums[i] != i+1,说明 i+1 就是缺失的最小正整数。
  3. 全包含 :如果遍历结束后所有位置都正确,说明 [1, n] 都存在,返回 n+1。

完整代码

cpp

复制代码
class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int n = nums.size();
        // 第一步:原地置换,将[1, n]范围内的数放到正确位置
        for (int i = 0; i < n; ++i) {
            // 当nums[i]在[1, n]范围内,且不在正确位置时,进行交换
            while (1 <= nums[i] && nums[i] <= n && nums[i] != nums[nums[i] - 1]) {
                int j = nums[i] - 1; // 计算正确的位置索引
                swap(nums[i], nums[j]); // 交换到正确位置
            }
        }
        
        // 第二步:遍历查找第一个缺失的正整数
        for (int i = 0; i < n; ++i) {
            if (nums[i] != i + 1) {
                return i + 1;
            }
        }
        
        // 如果[1, n]都存在,返回n+1
        return n + 1;
    }
};

复杂度分析

  • 时间复杂度 :O(n)
    • 虽然有两层循环,但每个元素最多被交换到其正确的位置一次,因此总的交换次数是 O (n)。两次线性遍历也是 O (n),所以整体时间复杂度为 O (n)。
  • 空间复杂度 :O(1)
    • 我们只在原数组上进行操作,没有使用额外的辅助空间,满足了常数级空间复杂度的要求。

示例演示

以 nums = [3, 4, -1, 1] 为例:

  1. 初始数组:[3, 4, -1, 1]
  2. 处理 i=0,nums[0]=3,应在位置 2,交换后数组变为 [-1, 4, 3, 1]。
  3. 处理 i=1,nums[1]=4,应在位置 3,交换后数组变为 [-1, 1, 3, 4]。
  4. 处理 i=1,nums[1]=1,应在位置 0,交换后数组变为 [1, -1, 3, 4]。
  5. 处理 i=2,nums[2]=3,已在正确位置;i=3,nums[3]=4,已在正确位置。
  6. 最终数组:[1, -1, 3, 4]。
  7. 遍历查找,发现 i=1 时 nums[1] != 2,所以返回 2。
相关推荐
朝朝辞暮i7 小时前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2
垆边人似月.8 小时前
华为题:污染水域
算法
智圣新创018 小时前
教育数据要素流通刚需下 智圣新创高校数据中台解决方案的全域建设落地框架
大数据·人工智能·物联网
All for pursuit.8 小时前
【回溯-6】79.单词搜索
数据结构·c++·算法·leetcode
ZhangJun958 小时前
Mobike 共享单车分析项目
人工智能·python·算法·kmeans·聚类·knn
XLYcmy8 小时前
PDF 论文处理器 — 优势与功能文档
大数据·python·网络安全·pdf·dify·rag·漏洞检测
互联网资讯8 小时前
本地创业者入局 AI 短剧,本地化部署怎么选更省钱
大数据·人工智能
Navigator_Z8 小时前
LeetCode //C - 1281. Subtract the Product and Sum of Digits of an Integer
c语言·算法·leetcode
小猴子爱上树8 小时前
跨马翻译:批量图片翻译+视频字幕+智能抠图,跨境电商在线图片翻译工具
大数据·人工智能·python·音视频
W***25928 小时前
2026 企业 AI 办公工具怎么选:选型框架与平台全景分析
大数据·人工智能