题目地址
https://leetcode.com/problems/first-missing-positive/
题目大意
一个整数数组,里面数字是无序的,在O(n)
的时间复杂度,O(1)
的空间复杂度下,找出最小的,没有在数组中出现的正数
解题思路
题目要求线性时间复杂度,所以就不能排序了。退而求其次,我们可以遍历数组,然后对每个数计算hash值。hash函数如下hash(n) = n - 1
,然后将其与数组对应位置的数字交换。这样,遍历之后,每一个大小在1 - (arr.size - 1)
的数字就都有了自己的位置。
然后再一次遍历数字,第一个不满足hash函数条件的位置,就对应的是题解。
代码
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n_size = nums.size();
if (n_size == 0) {
return 1;
}
for (int i = 0; i != n_size; ++i) {
while (nums[i] > 0 && nums[i] != i + 1) {
if (nums[i] > n_size) {
break;
}
int ex = nums[nums[i] - 1];
if (ex != nums[i]) {
nums[nums[i] - 1] = nums[i];
nums[i] = ex;
} else {
break;
}
}
}
for (int i = 0; i != n_size; ++i) {
if (nums[i] != i + 1) {
return i + 1;
}
}
return n_size + 1;
}
};