[LeetCode P41] First Missing Positive

原题:

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.

解题:
这是我刷到现在比较喜欢的一题了,题意清楚简单,但是需要一定的技巧解题。
首先我们需要找到最先丢失的正整数,其次我们要在O(n)时间,O(1)空间,最难的大概是O(1)空间,因为我们会想当然地使用hash。
但是我要注意,我们需要的hash值不会超过整个数组的长度,所以我们完全可以做到原址hash,也就是把需要hash的值交换到应该在的位置。
比如我们有
1, 2, 3, 5, 7,-1
1. 对于1,2,3,它们是原址的,所以不用hash。
2. 我们遍历到5的时候,可以把它和7交换,5到了该到的位置。
3. 注意我们要接着考察被交换过来的7是否合理,而7由于超过了nums.size(),所以不需要被hash。
4. 最后我们可以考察到所有的值,并且需要被值在1~nums.size() 的数据被放在对应的下标位置。也就是变成了1,2,3,7,5,-1
5. 最后再遍历一遍就可以了。
具体代码如下:

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int maxNum = nums.size();
        for(int i = 0; i < maxNum; i++){
            if(nums[i] <= 0 || nums[i] > maxNum || nums[i] == i + 1 || nums[nums[i]-1] == nums[i])continue;
            else{
                int temp = nums[i];
                nums[i] = nums[nums[i]-1];
                nums[temp-1] = temp;
                i--;
            }
        }
        for(int i = 0; i < maxNum; i++){
            if(i+1 != nums[i])return i+1;
        }
        return maxNum + 1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值