Leetcode--41. 缺失的第一个正数

给定一个未排序的整数数组,找出其中没有出现的最小的正整数。

示例 1:

输入: [1,2,0]
输出: 3
示例 2:

输入: [3,4,-1,1]
输出: 2
示例 3:

输入: [7,8,9,11,12]
输出: 1
说明:

你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。

 

思路:时间复杂度要求为o(n),那不可以用暴力法一次又一次的搜索

可以将每个数字放到对应的位置上,数字值超过数组大小的不用管,值小于等于0的不用管

最后从头遍历数组,出现第一个位置上缺失的值,那这个值就是最小的正整数

如果一直没有出现,那最小正整数就是nums.length+1

eg:

[1,5,2,0,-2]

-->进行对应位置的放置,[1,2,-2,0,5]

我们发现,第一个没有对应值的位置是i=2处,此时值应为3,但是却是-2,所以我们缺失的就是3

[1,3,4,2,5]

-->进行对应位置的放置,[1,2,3,4,5]

放置完成后,我们遍历数组,发现都有对应的值,所以我们缺失的就是nums.length+1=6

 

此方法遍历了两次数组,因此时间复杂度为2*O(n),也就是O(n)

 

提交的代码:

class Solution {

    public int firstMissingPositive(int[] nums) {

         int t;

            for(int i=0;i<nums.length;)

            {

                if(nums[i]<=0)

                {

                    i ++;

                    continue;

                }

                if(nums[i]-1>=nums.length)

                {

                    i++;

                    continue;

                }

                if(nums[i]!=i+1&&nums[nums[i]-1]!=nums[i])

                {

                    t = nums[nums[i]-1];

                    nums[nums[i]-1] = nums[i];

                    nums[i] = t;

                }

                else

                {

                    i++;

                }

            }

            for(int i=0;i<nums.length;i++)

            {

                if(nums[i]!=i+1)

                {

                    return i+1;

                }

            }

              return nums.length+1;

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值