Leetcode First Missing Positive 三个思路

原创 2013年12月06日 07:52:46

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.

 这条题目虽然简单,但是思路还是很多的,可以开拓一下思路。

下面三种思路都是O(n)时间复杂度,测试运行时间基本上都没区别:

1 排序之后查找

2 把出现的数值放到与下标一致的位置,再判断什么位置最先出现不连续的数值,就是答案了。

3 和2差不多,把出现过的数值的下标位置做好标识,如果没有出现过的数组的下标就没有标识,那么这个就是答案。

 第一个思路最简单了:

class Solution {
public:
	int firstMissingPositive(int A[], int n) {
		sort(A, A+n);
		int res = 0;
		int i = 0;
		while (i<n && A[i]<=0) i++;
		for (; i < n; i++)
		{//注意:一看到序列就应该马上反应问题:是否有重复元素???
			if (i>0 && A[i] == A[i-1]) continue;
			if (A[i] - res != 1) return res+1;
			else res = A[i];
		}
		return res+1;
	}
};


 下面是参考了leetcode上的程序,思路2:

 http://discuss.leetcode.com/questions/219/first-missing-positive

int firstMissingPositive2(int A[], int n) {
		for (int i=0; i<n; i++)
		{
			if (A[i] > 0 && A[i] < n)
			{
				//if (A[i]-1 != i && A[A[i]-1] != A[i])不用那么多条件就可以了。
				//因为只要是已经到位了的元素即:A[i]-1==i了,那么判断如果有重复元素
				//两个位置交换就最好考虑好两个位置出现的可能情况。考虑问题全面,两个条件都考虑好。
				//update:增加i!=A[i]表示i位置没到位,A[A[i]-1] != A[i]表示A[i]-1位置没到位,两个位置都判断也很好的。
				if (A[A[i]-1] != A[i])
				{
					swap(A[A[i]-1], A[i]);
					i--;
				}
			}
		}

		for (int j=0; j<n; ++j)
			if (A[j]-1 != j)
				return j+1;

		return n+1; 
	}

也是思路二,不过上面的是处理下标从1开始,下面的程序是处理下标从0开始的:

int firstMissingPositive3(int A[], int n) {
		int i = 0;
		while (i < n) {
			//逐个把A[i]放到A[i]位置的思想
			//1:找到一个A[i]是在0到n范围的就放到相应位置
			//2:没找到的直接跳过
			//简单来说:就是把数字与下标对应起来
			if (A[i] >= 0 && A[i] < n && A[A[i]] != A[i])
				swap(A[i], A[A[i]]);
			else i++;
		}
		int k = 1;
		while (k < n && A[k] == k) k++;
		if (n == 0 || k < n) return k;
		else return A[0] == k ? k + 1 : k;
	}

思路三,好像稍微复杂一点。

int firstMissingPositive4(int A[], int n) {
		if(n <= 0)
			return 1;
		int intOutOfRange = n + 2;
		//first run, turn every negetive value into an impossible positive value
		//make every value in A is positive
		for(int i = 0 ; i < n ; ++ i) {
			if(A[i] <= 0)
				A[i] = intOutOfRange;
		}
		//second run, make A[] as a hash table, A[i] indicate the presence of i + 1
		//the way is that, if k in [1,n] is in A[], then turn A[k -1] to negetive
		for(int i = 0 ; i < n ; ++i) {
			int ai = A[i];
			int absi = abs(ai);
			if(absi <= n)
				A[absi-1] = -abs(A[absi-1]);
		}
		//third run, if A[i] is positive, from step 2, we know that i + 1 is missing.
		for(int i = 0 ; i < n ; ++i) {
			if(A[i] > 0)
				return i + 1;
		}
		//all int from 1 to n is present, then return n + 1
		return n+1;
	}


 

简单:

//2014-1-27 update
	int firstMissingPositive(int A[], int n) 
	{
		for (int i = 0; i < n; )
		{
			if (0<A[i]&& A[i]<n && A[i] != i && A[A[i]] != A[i]) 
				swap(A[i], A[A[i]]);
			else i++;
		}
		for (int i = 1; i < n; i++) 
			if (A[i] != i) return i;

		return A[0] == n? n+1:n;
	}

 

 

 

 

版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者允许不得转载。

【LeetCode】First Missing Positive 解题报告

【题目】 Given an unsorted integer array, find the first missing positive integer. For example, Given...
  • ljiabin
  • ljiabin
  • 2014年12月28日 21:00
  • 4307

[leetcode]41. First Missing Positive,C++/python实现,hard难度

[leetcode]41. First Missing Positive,C++/python实现,hard难度
  • zl87758539
  • zl87758539
  • 2016年06月16日 19:37
  • 318

Leetcode First Missing Positive 三个思路

这条题目虽然简单,但是思路还是很多的,可以开拓一下思路。 下面三种思路都是O(n)时间复杂度,测试运行时间基本上都没区别: 1 排序之后查找 2 把出现的数值放到与下标一致的位置,再判断什么位置...
  • kenden23
  • kenden23
  • 2013年12月06日 07:52
  • 17369

LeetCode041 First Missing Positive 解析

详细见:leetcode.com/problems/first-missing-positive Java所用的算法不够清晰,见C和Python的while循环 while的作用:将val...
  • zxwtry
  • zxwtry
  • 2017年04月06日 22:21
  • 115

Leetcode:First Missing Positive

Given an unsorted integer array, find the first missing positive integer. For example, Given [1,...
  • nanjunxiao
  • nanjunxiao
  • 2013年10月23日 16:27
  • 10598

First Missing Positive -- LeetCode

原题链接: http://oj.leetcode.com/problems/first-missing-positive/  这道题要求用线性时间和常量空间,思想借鉴到了Counting sort中的...
  • linhuanmars
  • linhuanmars
  • 2014年03月13日 04:31
  • 11725

[leetcode] 41. First Missing Positive 解题报告

题目链接: https://leetcode.com/problems/first-missing-positive/ Given an unsorted integer array, find ...
  • qq508618087
  • qq508618087
  • 2016年03月29日 14:43
  • 348

leetcode -- First Missing Positive -- 简单trick题目

https://leetcode.com/problems/first-missing-positive/思路1 swap参考http://www.cnblogs.com/AnnieKim/archi...
  • xyqzki
  • xyqzki
  • 2015年12月22日 20:01
  • 320

leetcode:41. First Missing Positive (Java)

转载请注明出处:z_zhaojun的博客 原文地址 题目地址 First Missing PositiveGiven an unsorted integer array, find the ...
  • u012975705
  • u012975705
  • 2016年03月13日 15:28
  • 1304

[LeetCode41] First Missing Positive

Given an unsorted integer array, find the first missing positive integer. For example, Given [1,2,0...
  • sbitswc
  • sbitswc
  • 2014年06月17日 23:51
  • 2506
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Leetcode First Missing Positive 三个思路
举报原因:
原因补充:

(最多只允许输入30个字)