时间复杂度低,可考虑哈希表,但是考虑空间复杂度,只能用想其他办法。
可以通过将每个正数放在适合的位置,然后检查是否第一个位置对应不上的数就是第一个正数。
实际执行时遇到两个问题:
1.有时候出错了。是因为交换位置后,被换到前面的数字可能还没复位,所以导致没有放在对应的位置上。
解决方法:交换位置后,指针停留一下。
2.上面方法导致了另一个问题:当两个位置数字一样时候,进入无限循环。
解决方法:交换前判断是否相等,不相等时候再交换。
int firstMissingPositive(vector<int>& nums) { int length = nums.size(); for (int i = 0; i < length; i++) { if (nums[i] > 0 && nums[i] != i + 1 && nums[i] < length) { if (nums[i] != nums[nums[i] - 1]) { std::swap(nums[i], nums[nums[i] - 1]); if (i > 0) i--; } } } for (int i = 0; i < length;i++) if (nums[i] != i + 1) return i + 1; return length+1; }