《leetCode》:First Missing Positive

题目

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,56];中有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个位置。
        }
    }

《leetCode》:First Missing Positive_第1张图片

最后的AC结果如下:
《leetCode》:First Missing Positive_第2张图片

你可能感兴趣的:(LeetCode,算法,positive,FirstMiss)