问题描述:
Given an unsorted integer array, find the smallest missing positive integer.
题目意思就是找到最小的缺省的正整数。
解题思路(一):傻瓜解法
这是我自己的一个傻瓜解法:
- 创建一个大小为nums.size()+1的数组flag;
- 遍历nums为flag赋值,flag[i]==1表示nums中存在i值;
- 找到flag中第一个为0的元素i,返回i;
- 若一直没有返回,则说明,1到nums.size()在nums中都存在,则返回nums.size()+1;
源码(一)
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
if(nums.size()==0)
return 1;
// cout<<min_num;
vector<int> flag(nums.size()+1, 0);
// int index==1
for(int i=0; i<nums.size(); i++){
if(nums[i]>=1 && nums[i]<=nums.size())
flag[nums[i]] = 1;
}
for(int i=1; i<flag.size(); i++){
if(flag[i] == 0) return i;
}
return nums.size()+1;
}
};
解题思路(二):
首先把nums中所有在1到nums.size()之间的数字安排到对应的位置,对应关系为i+1==nums[i]
在开始遍历检查,直到找到第一个i+1!==nums[i]
class Solution {
public:
int firstMissingPositive(vector<int>& nums) {
for(int i=0; i<nums.size(); i++){
if(i+1==nums[i]) continue;
int x = nums[i];
while(x>=1 && x<=nums.size() && x!=nums[x-1]){
swap(x, nums[x-1]);
}
}
for(int i=0; i<nums.size(); i++){
if(i+1!=nums[i]) return i+1;
}
return nums.size()+1;
}
};