【LeetCode-41】First Missing Positive

本文介绍了一种寻找数组中缺失的最小正整数的高效算法。通过原地置换技巧,该算法能在O(n)时间内完成任务,且仅使用常数级额外空间。适用于n个元素的数组,每个元素都在0到n-1范围内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题真心不好做,后来翻来翻去找到了一道“n个元素的数组,里面的数都是0~n-1范围内的,求数组中重复的某一个元素,没有返回-1”这样的题,突然想到了解决方法

public class ImportantFirstMissingPositive {
	
	public int firstMissingPositive(int[] nums) {
        for(int i = 0;i < nums.length;){
        	//如果第i个位置不等于i + 1,将nums[i]和nums[nums[i]]进行交换,直到nums[i] <= 0 或者nums[i] == i + 1
        	//交换的约束条件(nums[i] > 0;nums[i] - 1 不能越界,否则会报outofindex;nums[nums[i] - 1] != nums[i] 否则进入了死循环)
        	if(nums[i] != i + 1 && nums[i] > 0 && nums[i] - 1 < nums.length && nums[nums[i] - 1] != nums[i]){
        		//这里交换的时候要先将nums[nums[i] - 1]赋值给临时变量,先将nums[i]赋值就会出错!
        		int temp = nums[nums[i] - 1];
        		nums[nums[i] - 1] = nums[i];
        		nums[i] = temp;
        	}
        	else{
        		i ++;
        	}
        }
        
        //遍历一遍,如果nums[i] != i + 1,则找到第一个缺失的正数
        for(int i = 0;i < nums.length;i ++){
        	if(nums[i] != i + 1){
        		return i + 1;
        	}
        }
        
        return nums.length + 1;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值