LeetCode 41. 缺失的第一个正数(First Missing Positive)

题目描述:

给定一个未排序的整数数组,找出其中没有出现的最小的正整数。

示例 1:

输入: [1,2,0]
输出: 3

示例 2:

输入: [3,4,-1,1]
输出: 2

示例 3:

输入: [7,8,9,11,12]
输出: 1

说明:

你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。


解题思路:

观察发现,不管数组内容是什么,输出结果始终在区间 [ 1 , size()+1 ] ,比如 [x,y,z] ,输出结果只能是1、2、3、4其中一个;

那么我们只需要知道数组里面有没有1、2 、3即可,但是题目要求空间复杂度为O(1),所以我们可以利用参数的数组:

将 1 放到nums[0],2放到nums[1],3放到nums[2];其他的数字不用管它,注意在放的时候nums[0]、nums[1]可能有其他数(可能为1、2、3),所以我们扫到1、2的时候就跟nums[0]、nums[1]里面的数交换,如果nums[0]和1相同就不管它,下一个;最后,输出结果为当nums[i] != i + 1时的 i + 1。

代码:

执行用时: 4 ms, 在First Missing Positive的C++提交中击败了99.71% 的用户

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        for(int i=0; i<nums.size(); i++) {
            if(nums[i] <= nums.size() && nums[i] >= 1) {
                swap(nums[ nums[i] - 1 ], nums[i]);
                if(nums[i] <= nums.size() && nums[i] >= 1 && nums[ nums[i] - 1 ] != nums[i])
                    i--;
            }
        }
        for(int i=0; i<nums.size(); i++)
            if(nums[i] != i + 1)
                return i + 1;
        return nums.size() + 1;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值