LeetCode 41. First Missing Positive

Qustion:

Given an unsorted integer array, find the first missing positive integer.

For example,
Given [1,2,0] return 3,
and [3,4,-1,1] return 2.

Your algorithm should run in O(n) time and uses constant space.

  • 题解:数组是按照从1开始的正整数算,并非寻找一组连续数字中缺失的正整数。即给出 60,61,62,64 四个数,输出结果是1并非63。
  • 关键点:将数组下标与数值内容建立对应关系
  • 思路:单指针从头开始,将当前下标中存放的值交换到与值相对应的下标的位置中去。例如:[3,4,-1,1] 作为输入,第一步操作为将 3 与 -1 交换使得3到第三个位置,也就是下标为 2 的位置。以此类推。如果交换后当前下标的数值仍然不对应当前下标,则保持指针不动继续进行交换,直到当前下标为对应的元素或者当前下标的元素为超范围的元素(小于等于0或者大于数组下标的数)才向前移动。
class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        //保存数组长度,并减少size()函数的调用次数
        int size = nums.size();
        for (int i = 0; i < size; i++) {
            //仅当保存的数值在合理范畴才交换
            if (nums[i] > 0 && nums[i] < size) {
                //保存待交换的目标下标,防止后续的数组越界问题
                int temp = nums[i] - 1;
                swap(nums[i], nums[temp]);
                //若交换后当前下标仍不对当前内容则保持指针不动
                //(nums[temp]!=nums[i] 是为了防止出现重复数字而产生死循环
                if ((nums[i] != i + 1) && (nums[temp] != nums[i]))
                    i--;
            }
        }
        
        //循环找到第一个下标不对应的元素即为缺失的第一个整数
        for (int i = 0; i < size; i++) {
            if (nums[i] != i + 1)
                return i + 1;
        }
        return size + 1;
    }
};

学到的内容

  • 常量空间想到原位排序
  • 内容与下标对应建立索引

你可能感兴趣的:(LeetCode 41. First Missing Positive)