leetcode 热题 100_缺失的第一个正数

该篇文章介绍了如何在不使用额外空间的条件下,通过正负模拟哈希的方法解决编程问题,即找出给定整数数组中第一个缺失的正整数。文章详细解释了算法步骤,包括处理负数和零、绝对值转换以及判断出现偶数次的数值

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

题解一:

        正负模拟哈希:偏技巧类的题目,在无法使用额外空间的情况下,只能在原数组中做出类似哈希表的模拟。除去数值,我们还可以用正负来表示下标值的出现情况。首先,数组中存在正负数和0,而负数和0对结果是没有影响的,我们将它们设置为一个较大的正数0x3f3f3f3f,如此,当前数组中就只存在正整数。

设想一下,没有出现的最小的正整数可能的值,一定是在[1,nums.length+1]中的,原因是数组最多只能有nums.length个正整数。因此下一步我们将处于这个范围内出现过的值,nums[值-1]设置为负数,来表示这个值已经出现过了。这里需要注意三点:第一,[1,nums.length+1]中只有[1,nums.length]可以用下标表示,而存储结果的值result可以初始化为nums.length+1。第二,我们需要用绝对值来表示这些正整数,因为先出现的值可能会将后出现的值设置为负数。第三,使用乘-1的方式,出现偶数次的数值仍然会被判断为未出现过,因此必须加上判断语句。

最后我们遍历数组,找到的第一个正数,对应的下标+1就是未出现过的最小正整数。

class Solution {
    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        int result = nums.length + 1;

        for (int i = 0; i < n; i++) {
            if (nums[i] <= 0) nums[i] = 0x3f3f3f3f;
        }

        for (int i = 0; i < n; i++) {
            int temp = Math.abs(nums[i]);
            if (temp <= n && nums[temp - 1] > 0) nums[temp - 1] *= -1;
        }

        for (int i = 0; i < n; i++) {
            if (nums[i] > 0) {
                result = i + 1;
                break;
            }
        }
        return result;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值