leetcode41. 缺失的第一个正数
思路:
由于对时间复杂度要求O(n),所以不能采用排序再二分查找的方法。
由于空间复杂度要求常数级,所以放弃哈希表法。
所以我们采用一种数组中较为常用的方法——原地哈希。将原数组作为哈希表。
代码
1 class Solution { 2 public: 3 int firstMissingPositive(vector<int>& nums) { 4 for (int i = 0; i < nums.size(); ++i) { 5 while (nums[i] >= 1 && nums[i] <= nums.size() && nums[i] != nums[nums[i]-1]) //注意 6 swap(nums[i], nums[nums[i]-1]); 7 } 8 9 for (int i = 0; i < nums.size(); ++i) { 10 if (nums[i] != i + 1) return i+1; 11 } 12 return nums.size() + 1; 13 } 14 };
注意:代码第5行最后的判断条件是 nums[i] != nums[nums[i]-1] 而不是nums[i] != i+1,如果写成后者会出现死循环。比如下标为1和5的位置值都是6,5位置上的6本就处在正确位置了,这时候遍历到3时如果判断不等于4就交换就会两个6一直交换造成死循环,所以应该判断的是是否和要交换位置的元素值相等,如果相等了就不用再交换了。