题意:给定一个数组,找出未出现最小的正数
思路:先找到正数中的最小值。如果大于1,则直接返回1。
否则,我们知道1应该放在a[0],2应该放在a[1],依次类推。所以遍历数组,当某个数不在该有的位置上时,交换到应在的位置上。要注意一趟不能保证完成,如(3,4,-1,1),一趟交换的结果是(-1,1,3,4),必须得多次才行。代码如下:(思路是参考网上的。。。)
int firstMissingPositive(vector<int>& nums) {
int i,j,size=nums.size(),minVal=INT_MAX,change=0;
for(i=0;i<size;i++) if(nums[i]>0) minVal=min(minVal,nums[i]);
if(minVal==INT_MAX ||minVal>1) return 1;
while(true)
{
change=0;
for(i=0;i<size;i++)
if(nums[i]>0&&nums[i]-minVal<size&&nums[nums[i]-minVal]!=nums[i])
{
change=1;
swap(nums[nums[i]-minVal],nums[i]);
}
if(change==0) break;
}
for(i=0;i<size;i++) if(nums[i]!=i+minVal) break;
return i+minVal;
}