力扣hot100 缺失的第一个正数 置换法 一题多解

Problem: 41. 缺失的第一个正数
在这里插入图片描述

💖 置换法

👨‍🏫 参考思路

在这里插入图片描述

⏰ 时间复杂度: O ( n ) O(n) O(n)
🌎 空间复杂度: O ( 1 ) O(1) O(1)

class Solution {
	public int firstMissingPositive(int[] nums)
	{
		int n = nums.length;
        //目标:nums[i] 存放 i+1 是正确的,表示存在 i+1 这个数
		for (int i = 0; i < n; i++)
		{
			if (i + 1 == nums[i])//无误跳过
				continue;
			int x = nums[i];
            // 在 [1,n] 之内的数就放在 nums[x-1]的位置
			if (x >= 1 && x <= n && x != nums[x - 1])
			{
				swap(nums, i, x - 1);
				i--;//交换后当前位置 i 是一个新的数,i-- 再次处理
			}
		}
// 当出现第一个 nums[i] != i+1 时,表示 (i+1)不存在,即缺失的最小正整数
		for (int i = 0; i < nums.length; i++)
			if (i + 1 != nums[i])
				return i + 1;
		return n + 1;

	}

//	交换数组 a 中 下标 i ,j 上的值
	private void swap(int[] a, int i, int j)
	{
		if (i != j)
		{
			a[i] ^= a[j];
			a[j] ^= a[i];
			a[i] ^= a[j];
		}
	}
}

💖 bit map

在这里插入图片描述
⏰ 时间复杂度: O ( n ) O(n) O(n)
🌎 空间复杂度: O ( n ) O(n) O(n)

    public int firstMissingPositive(int[] nums) {
        int length = nums.length;
        int bit[] = new int[(length - 1) / 32 + 1];
        for (int i = 0; i < nums.length; i++) {
            int digit = nums[i];
            //数组必须在1到length之间才有效
            if (digit >= 1 && digit <= length) {
                int index = (digit - 1) / 32;
                bit[index] |= (1 << ((digit - 1) % 32));
            }
        }
        //最后在执行一遍循环,查看对应位置的元素是否正确,如果不正确直接返回
        for (int i = 0; i < nums.length; i++) {
            if ((bit[i / 32] & (1 << (i % 32))) == 0)
                return i + 1;
        }
        return length + 1;
    }

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值