算法学习:缺失的第一个正数

这篇博客介绍了如何在O(n)时间和常数级额外空间复杂度下,通过标记法解决LeetCode上的《第一缺失的正数》问题。代码以Go语言实现,首先将数组中小于等于0的元素替换为N+1,然后遍历数组,将数值对应下标的元素取绝对值并置为负数,最后遍历数组找到第一个正数的下标加1即为缺失的最小正整数。
摘要由CSDN通过智能技术生成

题目描述

	给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
	请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

golang代码实现:

	func firstMissingPositive(nums []int) int {
    if len(nums) == 0{
        return 1
    }
    lens := len(nums)
    for i := 0; i <lens; i++{
        if nums[i] <= 0{
            nums[i] = lens + 1 
        }    
    } 

    for i := 0; i < lens; i++{
        num := abs(nums[i])
        if num <= lens{
            nums[num-1] = -abs(nums[num-1])
        }
    }

    var missNum int 
    for missNum = 0; missNum < lens; missNum++{
        if nums[missNum] > 0{
            return missNum + 1
        }
    }
    missNum += 1
   
    return missNum
}
func abs(num int)int{
    if num < 0{
        return -num
    }else{
        return num
    }
}

题目分析:
由于限制了时间复杂度和空间复杂度,不能新建hash获取缺失的正数。但是如果在原有数组上改造建立新数组。借助官方解题的标记法。

	1、缺失的数字在1-(N+1),将小于等于0的全部变为 N+1
	2、将属于1-N的值将其对应的下标上的值改为负数,这样所有的值都标记完了
	3、顺序遍历数组,得到第一个正数的值其下标+1,就是缺失的最小正整数。

题目来源:https://leetcode-cn.com/problems/first-missing-positive/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值