zoukankan      html  css  js  c++  java
  • 【LeetCode】缺失的第一个正数【原地HashMap】

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

    示例 1:

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

    示例 2:

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

    示例 3:

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

    说明:

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

    来源:力扣(LeetCode)
    链接:
    https://leetcode-cn.com/problems/first-missing-positive

    分析:

    要求时间复杂度为O(N),并且只能使用常数级别的空间

    根据抽屉原理:数组的长度n,则答案最大只能是n+1;
    可以使用hash函数将答案空间映射到长度为n+1的数组上,再遍历数组找到最小的没出现的正整数。
    为实现常数空间复杂度,可以使用原数组的空间:
    如果 0<nums[i]<=nums.length;
    则将nums[i] 跟 nums[nums[i]-1]交换;
    最后再遍历数组,如果num[i] != i+1,则i+1就是缺失的最小正整数。

    该方法可以叫做原地HashMap,利用原数组的空间,同时也只需要遍历两次数组

    时间复杂度:O(N)

    空间复杂度:O(1)

    class Solution
    {
    public:
        int firstMissingPositive(vector<int>& nums)
        {
            int n=nums.size();
            for (int i = 0; i < n; i++)
            {
                while(nums[i] != i+1 && nums[i] > 0 && nums[i] <= n && nums[i] != nums[nums[i]-1])
                {
                    int j = nums[i];
                    nums[i] = nums[j-1];
                    nums[j-1] = j;
                }
            }
            for (int i = 0; i < n; i++)
            {
                if(nums[i] != i+1)
                {
                    return i+1;
                }
            }
    
            return n+1;
        }
    };
  • 相关阅读:
    C# json转对象
    sit、qas、dev、pet
    vs professional 2019 离线安装包下载方法
    C# SHA512和Base64加解密方法
    C#获取客户端Ip工具类
    C#xml泛型序列化
    C#对象转换工具类
    C#记录日志到本地文件工具类
    05 Activity生命周期
    05 利用Appliction 传值Activity
  • 原文地址:https://www.cnblogs.com/yinbiao/p/11379510.html
Copyright © 2011-2022 走看看