1刷
这道题用了前几题刚刚学的unordered——map,大大刷短查找时间,二刷的时候记得用特殊的方法做!!!!!别用数据结构了!!!
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
unordered_map<int, bool>ma;
for(int i = 0; i < nums.size(); ++ i)
if(nums[i] > 0)
ma[nums[i]] = true;
for(int i = 1; i <= nums.size(); ++ i)
if(ma[i] == false)
return i;
return ma.size() + 1;
}
};
2刷
1刷用了无耻的unordered map,无技术含量。
正真的做法是把相应的nums的数目移到对应i的位子,因为有可能会把后面没有处理的数移到前面导致这个数没有判断(就是跳过判断了),所以要用while
好题,要3刷
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
for(int i = 0; i < nums.size(); ++ i){
while(nums[i] > 0 && nums[i] <= nums.size() && nums[nums[i] - 1] != nums[i])
swap(nums[nums[i] - 1], nums[i]);
}
for(int i = 0; i < nums.size(); ++ i)
if(nums[i] != i + 1)
return i + 1;
return nums.size() + 1;
}
};