题目
代码(首刷自解)
用set数据结构,但效率很低。
下次尝试用哈希表做。
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int res = 1;
set<int> q;
for(int i = 0; i < nums.size(); i++) {
if(nums[i] > 0) // 排除重复的
q.insert(nums[i]);
}
if(q.size() == 0) // 只有负数的情况下
return res;
for(auto& s : q) {
if(s != res)
return res;
res++;
}
return res;
}
};
代码(二刷自解)
原地哈希
将原数组看成哈希表,映射关系为i
->i-1
,前提是保证数字符合索引区间,即[1, n]
,最后对数组进行遍历,若nums[i] != i+1
,则找到了这个数。
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
int n = nums.size();
for(int i = 0; i < n; i++) {
while(nums[i] >= 1 && 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;
}
};
代码(8.23 三刷看解析)
class Solution {
public:
int minNumberDisappeared(vector<int>& nums) {
int n = nums.size();
for(int i = 0; i < nums.size(); i++) {
while(nums[i] >= 1 && nums[i] <= n && nums[i] != nums[nums[i]-1]) { // 直到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;
}
};
代码(9.24 四刷看解析)
原地哈希,没想到啊,又给忘了
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
for(int i = 0; i < nums.size(); i++) {
while(nums[i] >= 1 && 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;
}
};