您的位置:首页 > 其它

《leetCode》:First Missing Positive

2015-11-09 21:26 239 查看

题目

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.


题意:在没有排序的数组中找到第一个丢失的正整数(从1开始的)。要求时间复杂度为O(n)以及只允许用常数个空间

思路

思路:由于题目中明确的强调了时间复杂度为O(n),因此我们不可能采用将数组进行排序,
然后找到第一个相邻的两个数不相等中的第一个数加1就是我们要找的数,因为这样即使采用快排的时间复杂度也为O(nlogn)

因此,我们必须采用其他的方法。
我们都知道。一个从1开始的连续的整数的数组Arr[6]=[1,2,3,4,5,6];中有Arr[i]=i+1(数组下标从零开始的)这样的特点。
基于这样的特点,有了如下思路:我们遍历一次数组,将正数A[i]放在数组的第A[i]-1个位置,即swap(A[i],A[A[i]-1]);
使得完成遍历后A[i]与i+1相等,这样我们最终只需要寻找第一个不满足这样关系的前一个数加1就是我们要求的数。


实现代码如下:

void swap(int *a,int *b){
int temp=*a;
*a=*b;
*b=temp;
}
int firstMissingPositive(int* nums, int numsSize) {
if(nums==NULL||numsSize<1){
return 1;
}
for(int i=0;i<numsSize;){
if(nums[i]<0||nums[i]>numsSize||nums[i]==i+1||nums[i] == nums[nums[i] - 1]){
i++;
}
else{
//有一点需要注意的是:交换后并不执行i++操作,而是继续将交换到当前位置的元素  交换到应该属于到的位置
swap(&nums[i],&nums[nums[i]-1]);//将nums[i]放在数组的第i个位置。
}
}
int i=0;
for(;i<numsSize;i++){
if(nums[i]!=i+1){
break;
}
}
return nums[i-1]+1;

}


遇到的问题

1、刚开始只知道遍历一次数组,将数组中的元素A[i]放到数组的第A[i]-1个位置。

交换之后,就进行了i++操作,并没有对当前i值时新交换来的元素继续进行同样的操作。因此报错。刚开始的代码和报错截图如下:

for(int i=0;i<numsSize;i++){
if(nums[i]<0||nums[i]>numsSize||nums[i]==i+1||nums[i] == nums[nums[i] - 1]){
continue;
}
else{
//有一点需要注意的是:交换后并不执行i++操作,而是继续将交换到当前位置的元素  交换到应该属于到的位置
swap(&nums[i],&nums[nums[i]-1]);//将nums[i]放在数组的第i个位置。
}
}




最后的AC结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: