[LeetCode] First Missing Positive

[Problem]

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.


[Anlysis]

从头到尾进行一次遍历,假设合法的存储方式是A[i] = i+1,即A=[1,2,3,4,...]是合法的存储方式。
对于每一个元素A[i],令data=A[i],p=data-1,如果存储合法,则必然有A[p] == data;
如果A[p] != data,则令tmp = A[p],将data移动到A[p]上,并更新data和p:
  tmp = A[p];
  A[p] = data;
  data = tmp;
  p = data - 1;
重复上面的操作。注意:会出现data<=0或data>n的情况,遇到这种情况完全可以停止,不需要继续往下判断。
完成一次从头到尾的遍历后,所有的正整数都已经在合法的位置,只需要再进行一次遍历,判断哪个位置不合法,即不满足A[i] == i+1,则第一个未出现的正整数就是i+1,如果没有不合法位置,则未出现的第一个正整数是n+1.

[Solution]

class Solution {
public:
int firstMissingPositive(int A[], int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
for(int i = 0; i < n; ++i){
if(A[i] <= 0 || A[i] > n || A[i] == i+1){
continue;
}
else{
int data = A[i];
int p = data-1;
while((p >= 0 && p < n) && A[p] != data && (data > 0 && data <= n)){
int tmp = A[p];
A[p] = data;
data = tmp;
p = data-1;
}
}
}
for(int i = 0; i < n; ++i){
if(A[i] != i+1){
return i+1;
}
}
return n+1;
}
};


说明:版权所有,转载请注明出处。 Coder007的博客
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值