Leetcode 41. First Missing Positive

本文介绍了一种在O(n)时间内找到未排序整数数组中最小缺失正整数的算法,通过巧妙地将元素放置在正确的位置上,避免了排序和使用额外的空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

 

Given an unsorted integer array, find the smallest missing positive integer.

Example 1:

Input: [1,2,0]
Output: 3

Example 2:

Input: [3,4,-1,1]
Output: 2

Example 3:

Input: [7,8,9,11,12]
Output: 1

Note:

Your algorithm should run in O(n) time and uses constant extra space.

 

题意:

 

给定一个乱序整数数组,找出丢失的最小正整数,题目也给了几个例子。

 

这道题主要困难在 只能有O(n)的复杂度,所以排序用不了,并且只能用固定的额外空间(所以一些动态存储的数据结构不适合)

 

解法:

这个题我看到之后却是没有什么思路,网上参考了大佬的想法

个人理解如下:

我们可以假定最完美的数组形式就是

[1,2,3,4 ....]

也就是 num[i]=i+1   例如 num[0]=1    num[1]=2 ..

所以,我们通过一次遍历,需要做的就是把数放到合适的位置,比如对于  1 3 2 4

我们需要把 3放到index(数组下标)=2的位置

             把2放到index=1的位置

具体实现算法如下:

1.如果我们当前遇到的为非正整数, 我们直接跳入入下一个index

2.如果 nums[i] >nums.length 说明它不可能出现在合理的系列中(例如 17 2,对于7 它已经大于了总长度3,它没有位置可以放),我们直接他跳入下一个index

3.如果当前 nums[num[i]-1] != nums[i]   ,我们交换  index num[i]-1 和 i

    这里需要注意的是 我们不能用 num[i]-1 != i 来做判别

因为可能存在两个相等的值 例如  1 1

当我们在循环到第二个1 时,根据 num[1]-1 =0!= 1 ,交换  1  1,结果第二次还会检测到相同条件,最后陷入死循环

 

代码:

class Solution {
    public int firstMissingPositive(int[] nums) {
        int i=0;
        while(i < nums.length){
            if(nums[i] >= 1 && nums[i] <= nums.length && nums[nums[i]-1] != nums[i]) {
                swap(nums, i, nums[i]-1);
            }
            else{
                i++;
            }
        }
        i=0;
        while(i < nums.length && nums[i] == i+1) i++;
        return i+1;
        
    }
    private void swap(int[] nums, int i, int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值