地址:http://oj.leetcode.com/problems/first-missing-positive/
思路:模拟题。用一个足够长的布尔数组来存储。时间复杂度O(N), 空间复杂度都O(k).
在做题之前应该明白第一个缺失的正数应该是1~n+1之间的,如果1~n都被填满,那么应该返回n+1
如果k存在,则放在k-1的下标处,即A[k-1],具体如下操作:
1. 如果A[k] <=0 || A[k] > n, 无效, k递增,下一次循环
2. 如果A[k] <= k+1, 直接将A[k]赋值为k+1,k递增,下一次循环
3. 否则,若A[ A[K]-1 ] 值 <=0 || >n, 说明A[ A[K]-1 ] 值无效,直接将A[ A[K]-1 ] 赋值为A[k]
4. 否则,[ A[K]-1 ] 值有效,如果A[k] 与 A[ A[k]-1 ] 不相等, 置换,(相等的话k递增继续处理,因为A[k]的值被其后的A[A[k]-1]保留了)
5. 否则,k递增下一次循环
参考代码:c++
//SECOND TRIAL, O(N) running time with constant spaceclass Solution {public :int firstMissingPositive ( int A [], int n ) {int k = 0 ;while ( k < n ){if ( A [ k ] > 0 && A [ k ] <= n ){if ( A [ k ] <= k + 1 )A [ A [ k ] - 1 ] = A [ k ++ ];else if ( A [ A [ k ] - 1 ] <= 0 || A [ A [ k ] - 1 ] > n )A [ A [ k ] - 1 ] = A [ k ++ ];else if ( A [ A [ k ] - 1 ] != A [ k ])swap ( A [ k ], A [ A [ k ] - 1 ]);else++ k ;}else++ k ;}for ( int i = 0 ; i < n ; ++ i )if ( A [ i ] != i + 1 )return i + 1 ;return n + 1 ;}};
python:
class Solution :# @param A, a list of integers# @return an integerdef firstMissingPositive ( self , A ):cnt = 0while cnt < len ( A ):if A [ cnt ] > 0 and A [ cnt ] <= len ( A ):if A [ cnt ] <= cnt + 1 :A [ A [ cnt ] - 1 ] = A [ cnt ]cnt += 1elif A [ A [ cnt ] - 1 ] <= 0 or A [ A [ cnt ] - 1 ] > len ( A ):A [ A [ cnt ] - 1 ] = A [ cnt ]cnt += 1elif A [ cnt ] != A [ A [ cnt ] - 1 ]:#better to use tmp to swap#tmp = A[cnt]#A[cnt] = A[A[cnt]-1]#A[tmp-1] = tmp#Attention!! this one is OK, but A[cnt], A[A[cnt]-1] = A[A[cnt]-1], A[cnt] is wrongA [ A [ cnt ] - 1 ], A [ cnt ] = A [ cnt ], A [ A [ cnt ] - 1 ]else :cnt += 1else :cnt += 1for i in range ( 0 , len ( A )):if A [ i ] != i + 1 :return i + 1return len ( A ) + 1