LeetCode 41. First Missing Positive

本文介绍了一道经典算法题——寻找数组中第一个缺失的正整数。提供了两种解决方案:一种通过标记法实现,另一种采用巧妙的数值交换技巧。文章详细解析了每种方法的实现步骤及核心代码。

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

41. First Missing Positive

Given an unsorted integer array, find the first missing positiveinteger.

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.

题目要求寻找第一个丢失的正数。

看题没思路-----苦思未果看题解去

然后我就说说我看的这两种解:

第一种比较正规:

         

大题思路就是首先将正和负的分成两份---直接过滤可以:
                   If(nums[i]>0)nums[n++]=nums[i];
         然后就是对前n个数遍历一边并对在[1,n]之间的数tmp=nums[i]对应的下标 nums[tmp-1] 的数变成负数。
         最后在遍历一遍查看那个(i<n)第一个非负数即时结果。

         代码

 

public class Solution{
	public int firstMissingPositive(int[] nums){
		int n=0;
		for(int i=0;i<nums.length;i++)
			if(nums[n]>0) nums[n++]=nums[i];
		int res=n,tmp;
		for(int i=0;i<n;i++){
			tmp=Math.abs(nums[i]);
			if(tmp<=n) nums[tmp]=-Math.abs(nums[tmp]);
		}
		for(int i=0;i<n;i++){
			if(nums[i]>0) {res=i+1;break;}
		}
		return res;
	}
}

 

第二种有点脑筋急转弯的感觉

         

遍历一遍所有的数tmp=nums[i],当tmp>0时 将交换下标为tmp-1和i 的数即swap(nums,tmp,i);
         最后遍历一遍所有数查到nums[i]!=i+1的即为结果.

代码:

public class Solution {
    public int firstMissingPositive(int[] nums) {
    	for(int i=0;i<nums.length;++i)
    		// if(nums[i]>0&&nums[i]<=nums.length)--->this will be wrong when the nums[i] is big
    		// for example {3,4,-1,1}
    		while(nums[i]>0&&nums[i]<=nums.length&&nums[nums[i]-1]!=nums[i])
    			swap(nums,i,nums[i]-1);
   		for(int i=0;i<nums.length;++i)
   			if(nums[i]!=i+1)
   				return i+1;
   		return nums.length+1;
    }
    public void swap(int[] nums,int i,int j){
    	int tmp=nums[i];
    	nums[i]=nums[j];nums[j]=tmp;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值