@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