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

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

这个算法的核心思想是通过交换操作,将每个数放到它应该在的位置上。然后再次遍历数组,找到第一个不在正确位置上的数,其索引加一即为缺失的最小正整数。

def first_missing_positive(nums):
    n = len(nums)
    # 第一次遍历,将数组中的每个数放到正确的位置上
    for i in range(n):
        while 1 <= nums[i] <= n and nums[nums[i] - 1] != nums[i]:
            nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
    # 第二次遍历,找到第一个不在正确位置上的数,即为缺失的最小正整数
    for i in range(n):
        if nums[i] != i + 1:
            return i + 1
    # 如果数组中所有数都在正确位置上,则缺失的是数组长度+1
    return n + 1

这个算法的时间复杂度是 O(n),因为每个数最多进行两次交换操作,而且只进行了两次遍历。额外空间复杂度是 O(1),因为只使用了常数级别的额外空间。

原地哈希算法的原理是通过修改输入数据本身,将数据映射到正确的位置上,从而完成一些特定的操作。在具体的场景中,原地哈希算法通常用于解决一些空间复杂度受限制的问题,以达到在常数级别的额外空间内完成操作的目的。

for i in range(n):
    while 1 <= nums[i] <= n and nums[nums[i] - 1] != nums[i]:
        nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
  1. 在这一步中,如果 nums[i] 不在正确的位置上,并且它应该在的位置上的数不等于它,就进行交换。
  2. 第二次遍历:找到第一个不在正确位置上的数,即为缺失的最小正整数。

for i in range(n):

   if nums[i] != i + 1:

       return i + 1

 

在这一步中,如果 nums[i] 不等于 i + 1,说明 i + 1 是缺失的最小正整数。

这样,通过两次遍历和原地交换的方式,就可以在常数级别的额外空间内找到未排序整数数组中缺失的最小正整数。

原地哈希算法通常涉及到将数据按某种规则重新排列,以满足问题的要求,而不需要额外的数据结构来存储中间结果。

相关文章
|
4月前
给定 n 个整数,求里面出现次数最多的数,如果有多个重复出现的数,求值最大的那个 给定n个整数,求里面出现次数最多的数,如果有多个重复出现的数,求出值最大的一
给定 n 个整数,求里面出现次数最多的数,如果有多个重复出现的数,求值最大的那个 给定n个整数,求里面出现次数最多的数,如果有多个重复出现的数,求出值最大的一
|
8月前
|
算法
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
|
28天前
给定一个长度为n的数组,请将数组中元素按照奇偶性重新划分,所有奇数靠左边,所有偶数靠右边,然后分别对奇数、偶数部分进行排序
给定一个长度为n的数组,请将数组中元素按照奇偶性重新划分,所有奇数靠左边,所有偶数靠右边,然后分别对奇数、偶数部分进行排序
15 1
|
4月前
|
Python
计算小于或等于n的非负整数区间包含的1的数量
计算小于或等于n的非负整数区间包含的1的数量
22 0
判断一个数是否是对称数(数组/非数组解法)
判断一个数是否是对称数(数组/非数组解法)
|
12月前
求整数序列中出现次数最多的数
求整数序列中出现次数最多的数
113 0
求出任意非负整数区间中1出现的次数
求出任意非负整数区间中1出现的次数
76 0
随即输入10个数,并求10个整数最大值
随即输入10个数,并求10个整数最大值
75 0
随即输入10个数,并求10个整数最大值
|
机器学习/深度学习 存储 算法
【简单算法】1.两数之和,给定整数数组和目标值,找出数组中2数之和等于目标值的元素
【简单算法】1.两数之和,给定整数数组和目标值,找出数组中2数之和等于目标值的元素
【简单算法】1.两数之和,给定整数数组和目标值,找出数组中2数之和等于目标值的元素
数组——209.长度最小的子数组
本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助