因为是要找到正数,所以0可以不用管,使原序列调整到序号为i的元素值为i+1,非正数或者大于这个范围的数就不管它。
这样正确的数就会归位,错误的数直接一次遍历就能找到。
class Solution { public: int firstMissingPositive(vector<int>& nums) { if(nums.size()==0) return 1; for(int i=0;i<nums.size();i++) { while(nums[i]!=i+1){ if(nums[i]<=0||nums[i]>=nums.size()||nums[i]==nums[nums[i]-1]) break; else swap(nums[i],nums[nums[i]-1]); } } for(int j=0;j<nums.size();j++) if(nums[j]!=j+1) return j+1; return nums.size()+1; } };