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一直交换造成死循环,所以应该判断的是是否和要交换位置的元素值相等,如果相等了就不用再交换了。

原文地址:https://www.cnblogs.com/joker1937/p/14670414.html