码迷,mamicode.com
首页 > 其他好文 > 详细

41. First Missing Positive

时间:2017-02-25 21:17:34      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:turn   选择   swap   run   ant   mis   ted   first   missing   

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.

 解题思路:本题的核心思想就是将x放置到nums[x-1]的位置上去,然后从头开始遍历数组即可。但是把数交换过去和只是标记符合条件的数存不存在的两种选择衍生出了两种不同的解法。

解法一:并不交换,而用数的正负性来表示数的存在与否。具体地说,如果x属于区间[1,n],将x-1处的数变成负数即可。具体代码如下:

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int n=nums.size();
        for(int i=0;i<n;i++){
            if(nums[i]>=1&&nums[i]<=n)continue;
            nums[i]=n+1;
        }
        for (int i=0;i<n;i++) {
            int ori=abs(nums[i]);
            if (ori<=n)nums[ori-1]=-abs(nums[ori-1]);//nums[i] < 0 means i+1 exist
        }
        for(int i=0;i<n;i++)
            if(nums[i]>=0)return i+1;
        return n+1;
    }
};

解法二:每次都把[1,n]区间内的x移动到nums[x-1]处

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int n=nums.size();
        for(int i=0;i<n;i++){
           while(nums[i]>0&&nums[i]<=n&&nums[i]!=nums[nums[i]-1])
           swap(nums[i],nums[nums[i]-1]);
        }
        for(int i=0;i<n;i++)
            if(i+1!=nums[i])return i+1;
        return n+1;
    }
};

 

41. First Missing Positive

标签:turn   选择   swap   run   ant   mis   ted   first   missing   

原文地址:http://www.cnblogs.com/tsunami-lj/p/6442567.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!