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

17 篇文章 0 订阅
3 篇文章 0 订阅

题目

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值