您的位置:首页 > 其它

LeetCode OJ 之 First Missing Positive (第一个丢失的正数)

2015-01-29 14:32 337 查看

题目:

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) 。空间复杂度:O(1) 。

思路:

参考:http://blog.csdn.net/pickless/article/details/9234301 。

把数组排序,再遍历。关键是如何用 O(n) 的时间排序数组。

比如数组:        6 4 3 -2 1 5

假设排序后为:1 -2 3 4 5 6

观察排序后的数组的特点是:A[i] = i + 1 ;于是我们可以对数组进行遍历,判断A[i] = i + 1 是否成立,如果不成立,则与后面的数交换,与谁交换是关键,这里我们用 A[i] 与 A[A[i]- 1]  交换,这样后面的 A[A[i]- 1]  = A[i] ,比如 A[0]=6,我们用 A[0] 和 A[5] 交换,交换后A[0] = 5,仍然不满足条件,但是 A[5] = 6,则符合条件了,那么继续对A[0]进行判断,然后交换,这样保证每次交换后有一个数满足了条件,于是最多循环 n 次,时间复杂度就是
O(n) .拍好序后,找到 A[i] != i+1 的位置,那么下标的下一个就是所求的答案。

代码:

class Solution {
public:
int firstMissingPositive(int A[], int n)
{
bucket_sort(A,n);
for(int i = 0 ; i < n ; i++)
{
if(A[i] != i + 1)
return i + 1;
}
return n + 1;
}
void bucket_sort(int A[] , int n)
{
for(int i = 0 ; i < n ; i++)
{
while(A[i] != i + 1)
{
//如果A[i] <= 0 || A[i] > n,这相当于符合条件了,则继续下一次判断
//如果A[i] == A[A[i] - 1],则不再判断,否则陷入死循环了,比如 3 1 3 4 5
if(A[i] <= 0 || A[i] > n || A[i] == A[A[i] - 1])
break;
swap(A[i] , A[A[i] - 1]);//交换后下标为i的不一定满足条件,但是下标为A[i] - 1 的位置一定满足了条件,因为A[A[i]-1] = A[i],令A[i]=n,则有A[n-1] = n ,因此可以断定while循环最多循环n次,即时间复杂度为O(n)
}
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: