@LeetCode缺失的第一个正数--First Missing Positive[C++]

本文介绍了一种高效解决LeetCode上寻找数组中缺失的最小正整数问题的方法,采用座位交换法,时间复杂度O(n),空间复杂度O(1)。通过实例演示了算法的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@LeetCode缺失的第一个正数--First Missing Positive[C++]

问题描述

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

示例1:

输入:[1, 2, 0]
输出:3

示例2:

输入:[3, 4, -1, 1]
输出:2

示例3:

输入:[7, 8, 9, 11, 12]
输出:1

说明:

算法时间复杂度应为O(n),并且只能使用常数级别的空间。

解决方法与复杂度分析

思路

根据说明要求,可以明确算法只能在数组上进行计算。

我们使用一种“座位交换法”来实现算法。

  • 从第一个位置开始,让座位上的乘客走到自己应该坐的位置,并让该位置的人坐到第一个位置。一直进行这样的操作,直到第一个位置的人坐到自己位置。不过有时候我们知道,有的人总喜欢逃票。因此终止条件就是,一旦发现第一个位置的人逃票(票号 <= 0,或 >= 最大座位号),则终止交换。
  • 对第二到 N 个位置做相同的操作。

复杂度分析

  • 时间复杂度:O(n)
    座位交换法的本质是一次次遍历数组。
  • 空间复杂度:O(1)
    算法只有交换操作,没有申请新的空间,所以空间复杂度是常数级别的。

程序实现

	class Solution {
	public:
		int firstMissingPositive(vector<int>& nums) {
			for (int i = 0; i < nums.size(); i++) {
				while (0 < nums[i] && nums[i] <= nums.size() && nums[i] != nums[nums[i] - 1]) {
					swap(nums[i], nums[nums[i] - 1]);
				}
			}
			for (int i = 0; i < nums.size(); ++i) {
				if (nums[i] != i + 1) {
					return i + 1;
				}
			}
			return nums.size() + 1;
		}
	};

@北京·海淀 2019.04.22

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值