您的位置:首页 > 其它

[leetcode] First Missing Positive

2014-05-08 15:35 411 查看


First Missing Positive

使用原数组下标和数组元素进行映射的方法,找到第一个不对应的元素,返回其下标+1即可。

#include "iostream"
using namespace std;

class Solution {
public:
int firstMissingPositive(int A[], int n) {

if (A==NULL||n<1) {//数组为空
return 1;
}
int cur=0;

while (cur<n) {

int temp=A[cur];

if (temp>0&&temp<=n&&A[temp-1]!=temp) {//注意交换条件
//条件1:0<temp<=n
//条件2:temp!=cur+1,条件3已经包含了这种情况temp=A[cur+1],故可以省去。
//条件3:A[temp-1]!=temp,防止死循环
//交换

A[cur]=A[temp-1];
A[temp-1]=temp;
continue; //继续while循环
}

++cur;

}

//遍历数组找到第一个映射不一致的位置

cur=0;
while (cur<n&&A[cur]==cur+1) {
++cur;//相对于cur++,推荐使用++cur

}
return cur+1;
}

};

int main(){
int A[]={3,4,-1,1};
Solution so;
cout<<so.firstMissingPositive(A, 4)<<endl;
return 0;
}


精简代码版:

class Solution {
public:
int firstMissingPositive(int A[], int n) {
//[0..i) is 1..i
for (int i=0; i<n; ) {
if (A[i]==i+1) {
++i;
}else if ((A[i]<=i)||(A[i]>n)||(A[A[i]-1]==A[i])){
A[i]=A[--n];
}else{
swap(A[i], A[A[i]-1]);
}
}
return n+1;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: