41 First Missing Positive

45 篇文章 0 订阅
8 篇文章 0 订阅

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

Example 1:

Input: [1,2,0]
Output: 3

Example 2:

Input: [3,4,-1,1]
Output: 2

Example 3:

Input: [7,8,9,11,12]
Output: 1

Note:

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

3 标准解

3.1 分析

在给定的整数数组中找到最小的未出现的正整数。要求不适用额外空间。

如果使用额外空间,可以使用hashmap,这里考虑把用该数组实现一个hashmap。对于长度为n的数组,最小的未出现的正整数不超过n+1。考虑用第i个位置上元素的符号表示正整数i+1是否出现过。

首先遍历数组,把非正整数全部赋值为1,同时确保1在原数组中出现过,否则直接返回1。此时所有元素的符号都为正。

然后再次遍历数组,如果正整数k(k<=n)出现,则把位置k-1上的元素改为负数,但绝对值不变。

最后再次遍历数组,找到第一个正数,对应的位置i+1即为所求。

3.2 代码

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        bool start = false;
        for(auto&n : nums){
            if(n == 1)
                start = true;
            n = (n <= 0? 1:n);            
        }
        if(!start) return 1;
        
        for(auto&n : nums){
            int val = abs(n);
            if(val <= nums.size())
                nums[val-1] = -abs(nums[val-1]);
        }
        int result = 0;
        for(;result<nums.size();result++)
            if(nums[result] > 0)
                return result+1;
        return result+1;
    }
};

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值