• [LeetCode] 41. 缺失的第一个正数(Java)


    [LeetCode] 41. 缺失的第一个正数(Java)

    1.题目描述

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

    请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

    示例 1:
    
    输入:nums = [1,2,0]
    输出:3
    示例 2:
    
    输入:nums = [3,4,-1,1]
    输出:2
    示例 3:
    
    输入:nums = [7,8,9,11,12]
    输出:1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.解题思路

    对于一个长度为 N 的数组,其中没有出现的最小正整数只能在 [1, N+1]中。这是因为如果 [1, N] 都出现了,那么答案是 N+1,否则答案是 [1, N] 中没有出现的最小正整数。这样一来,我们将所有在 [1, N]范围内的数放入哈希表,也可以得到最终的答案。(官解)

    3.解法

    解法一 原地哈希

    class Solution {
        public int firstMissingPositive(int[] nums) {
            int len = nums.length;
            for (int i = 0; i < len; i++){
                // 把所有小于等于0得元素设为len + 1
                if (nums[i] <= 0) nums[i] = len + 1;
            }
            for (int i = 0; i < len; i++){
                // 记录该元素索引,如果索引在[0, n]之间,标记索引处的元素为负数
                int index = Math.abs(nums[i]) - 1;
                if (index <= len -1){
                    nums[index] = -Math.abs(nums[index]);
                }
            }
            for (int i = 0; i < len; i++){
                if (nums[i] > 0){
                    return i + 1;
                }
            }
            return len + 1;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    4.技能点

    原地哈希

  • 相关阅读:
    人工智能基础 作业6
    软件系统功能测试的依据
    freeswitch的3XX重定向
    Linux上的Redis客户端软件G-dis3
    kafka安装流程
    链表【数据结构与算法Java】
    leetcode152 乘积最大子数组
    React Hooks
    uView Calendar 日历
    01-ZooKeeper快速入门
  • 原文地址:https://blog.csdn.net/qq_48759664/article/details/126373418