【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;
    }
};

原文地址:https://www.cnblogs.com/yinbiao/p/11379510.html

时间: 2024-11-02 11:12:34

【LeetCode】缺失的第一个正数【原地HashMap】的相关文章

LeetCode:缺失的第一个正数【41】

LeetCode:缺失的第一个正数[41] 题目描述 给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3示例 2: 输入: [3,4,-1,1] 输出: 2示例 3: 输入: [7,8,9,11,12] 输出: 1说明: 你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间. 题目分析 参照链接:https://leetcode-cn.com/problems/first-missing-positive/solution/tong

[leetcode] 41. 缺失的第一个正数

41. 缺失的第一个正数 注意这题要求时间复杂度应为O(n),并且只能使用常数级别的空间. 挺有意思的一个题. 思路: 通过交换元素的位置使得正确的位置仅存放正确的数字,例如给定一个数字3那么他应该在第三个位置,下标为2 .当数字>n 或 <1 时,不做操作.当出现重复数字时,置成-1 比如输入3,4,-1,1 扫描一遍后应该是 1 -1 3 4 class Solution { public int firstMissingPositive(int[] nums) { int n = num

leetcode——41. 缺失的第一个正数

class Solution(object): def firstMissingPositive(self, nums): """ :type nums: List[int] :rtype: int """ if nums==[]: return 1 for i in nums: if i<=0: nums.remove(i) if nums==[]: return 1 for i in range(1,len(nums)+1): if i

缺失的第一个正数

第一种(较差) export default (arr) => { // 过滤掉非正整数 arr = arr.filter(item => item > 0) // 正整数数组是不是为空 if (arr.length) { // 升序,目的:方便从左到右取最小值arr[0] arr.sort((a, b) => a - b) // 如果第一个元素不为1,返回1 if (arr[0] !== 1) { return 1 } else { // 从左边开始遍历,只要下一个元素和当前元素

41. 缺失的第一个正数

给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 class Solution: def firstMissingPositive(self, nums): """ :type nums: List[int] :rtype: int """ list1 = [] list2 = [] for i in nums: if i > 0

Leetcode 41 缺失的第一个整数

题目描述:给定一系列为排序的整数,求出最小的缺失的正数. 题解:对于给定的N个数,对于小于等于0以及大于N的数字不予处理,其余的数字在一次遍历的时候将其放在对应的位置上.例如给定<1,3,-1,4>,1的位置不用变,3与-1交换,4不用变.处理之后检查一下index上的数字是否对应,不对应的数字就是缺失那个正数. 代码: int firstMissingPositive(vector<int>& nums) { int Len = nums.size(); int pos

LeetCode OJ 347. Top K Frequent Elements hashmap+排序求解

题目链接:https://leetcode.com/problems/top-k-frequent-elements/. 347. Top K Frequent Elements My Submissions QuestionEditorial Solution Total Accepted: 15510 Total Submissions: 36453 Difficulty: Medium Given a non-empty array of integers, return the k mo

41. First Missing Positive【leetcode】寻找第一个丢失的整数,java,算法

41. 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. 题目:寻找第一个丢失的整数意思为[1,2,4,5,

【leetcode 简单】 第一百题 压缩字符串

给定一组字符,使用原地算法将其压缩. 压缩后的长度必须始终小于或等于原数组长度. 数组的每个元素应该是长度为1 的字符(不是 int 整数类型). 在完成原地修改输入数组后,返回数组的新长度. 进阶: 你能否仅使用O(1) 空间解决问题? 示例 1: 输入: ["a","a","b","b","c","c","c"] 输出: 返回6,输入数组的前6个字符应该是:[&q