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) } } } };
相关文章推荐
- LeetCode OJ:First Missing Positive (第一个丢失的正数)
- First Missing Positive (寻找第一个丢失的正数)【leetcode】
- LeetCode 41 First Missing Positive(找到数组中第一个丢失的正数)
- First Missing Positive 第一个消失的正数
- First Missing Positive 找第一个没在array中出现的正数@LeetCode
- *[Lintcode]First Missing Positive 丢失的第一个正整数
- LeetCode--First Missing Positive (第一个丢失的正整数)Python
- MissingNumber缺失的数字,FirstMissingPositive第一个缺失的正数
- lintcode:First Missing Positive 丢失的第一个正整数
- LintCode : 第一个丢失的正整数 First Missing Positive
- First Missing Positive(在数组中找到第一个丢失的正整数)
- 【LeetCode OJ 41】First Missing Positive
- 找到数组中第一个不见的正整数(First Missing Positive )
- [Leetcode] first missing positve 缺失的第一个正数
- LeetCode OJ:First Missing Positive
- LeetCode | First Missing Positive(第一个缺失的正整数)
- [LeetCode(Q41)] First Missing Positive (乱序数组中寻找第一个未出现的正整数)
- [LeetCode] 找到第一个不存在的正整数 First Missing Positive
- [LeetCode(Q41)] First Missing Positive (乱序数组中寻找第一个未出现的正整数)
- LeetCode OJ-- First Missing Positive