[leetcode]41. First Missing Positive,C++/python实现,hard难度

来源:互联网 发布:精通qt4编程 源码 编辑:程序博客网 时间:2024/06/08 16:35

题目

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.
Subscribe to see which companies asked this question

刚开始觉得挺简单的,一看好多限制条件,要O(n)的时间复杂度,而且还要常数空间。

分析一下:因为是最小的整数,
反正是从1,2,3。。。。开始的。
那就把每一个数,给到他们自己的位置,比如说【3,4,-1,1】
把所有的数都放到位置:变成【1,-1,3,4】 那就能找到 那个-1的位置了。
因为要常数空间,那估计的言外之意就是,交换swap。

1.不过这里面有坑,首先【2,3】这样的,3就不能换,也就是说大过数组长度的不要动。
3.而且小于0的也不能换,
3.还有这个【3,4,-1,1】如果只换一次。。
先换3,变成【-1,4,3,1】
然后4 变成【-1,1,3,4】
哎到头了。。。这个1怎么办。。。
所以要不停的换,换到不能换了为止:
改成:
先换3,变成【-1,4,3,1】,第一个位置是-1,不能换了
再还4,变成【-1,1,3,4】,第二个位置是1,继续换【1,-1,3,4】
后面就不换了。。。
4.还有一个坑:【1,2,3】。。。换到头了,怎么办,返回4。

下面上代码:

class Solution(object):    def firstMissingPositive(self, nums):        """        :type nums: List[int]        :rtype: int        """        L=len(nums)        for m in range(L):            if nums[m]>L:                continue            val = nums[m]-1            while nums[m]>0 and val<L and nums[val] != nums[m]:                #小于等于0,大于等于长度的不换。                nums[m],nums[val]=nums[val],nums[m]                val = nums[m]-1        for m in range(len(nums)):            if nums[m] != m +1:                return m +1        return L+1
class Solution {public:    int firstMissingPositive(vector<int>& nums) {        if(nums.size()==0)return 1;        int t;int p=1;        while(p){        p=0;        for(auto i=nums.begin();i!=nums.end();i++){           if(*i>0){               t=*i;               if(t>nums.size())continue;               if(*i==*(nums.begin()+t-1))continue;               *i=*(nums.begin()+t-1);                            *(nums.begin()+t-1)=t;               p=1;           }               }        }        for(auto i=nums.begin();i!=nums.end();i++){            if(*i!=i-nums.begin()+1)return i-nums.begin()+1;        }return nums.size()+1;    }};
0 0
原创粉丝点击