LeetCode First Missing Positive

本文介绍了一种在未排序整数数组中查找首个缺失正整数的算法,该算法能在O(n)时间内运行并使用常数空间。通过示例说明了如何利用原地哈希的思想来解决问题。

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

题目:

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,0],那么第一个没有出现的正数就是3。

题解:

通过本题给的例子,我们可以发现,要求第一个没有出现的正数,那么这个正数必然在1到这个数组的长度之间的数字,因为会有连续的正数出现,那么我们可以想到采用类似于哈希表的形式,将每个数字和它所应该对应的下标,因为正数从1开始,那么其下标我们规定从0开始,同时题目又要求空间复杂度为O(1),也就是不能有额外的空间,所以我们就可以通过交换的方式来进行;最后扫描一遍数组,发现数组中的第一个数字不等于它的下标减1的那个数,返回。如果没有这个数字出现,那么就返回数组长度 + 1.类似于例子1的情况。如果数组中的数字是小于等于0或者是大于数组的长度的,那么直接就pass,不在我们题目考虑的范围内。

public int firstMissingPositive(int[] nums)
	{
		int length = nums.length;
		for(int i = 0; i < length; i++)
		{
			if(nums[i] > 0 && nums[i] <= length)   //如果这个数字是在我们考虑的范围内,那么我们就进一步就要和交换了
			{
				if(nums[i] - 1 != i && nums[nums[i] - 1] != nums[i])
				{
					int temp = nums[nums[i] - 1];
					nums[nums[i] - 1] = nums[i];
					nums[i] = temp;
					i--;
				}
			}
		}
		for(int i = 0; i < length; i++)   //查看这个新调整后的数组中第一个数字不等于它的下标-1的数字,返回
		{
			if(nums[i] != i + 1)
				return i + 1;
		}
		return length + 1;  //否则说明没有这个数字出现,那么就返回数组的长度 + 1
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值