【Leetcode刷题Python】牛客. 数组中未出现的最小正整数

简介: 本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。

牛客. 数组中未出现的最小正整数

1 题目

给定一个无序数组arr,找到数组中未出现的最小正整数

例如arr = [-1, 2, 3, 4]。返回1

​ arr = [1, 2, 3, 4]。返回5

[要求]

时间复杂度为O(n),空间复杂度为O(1)

链接:https://www.nowcoder.com/questionTerminal/030cabe03d94484c819e87c2e38c41bd?f=discussion
来源:牛客网

输入描述:

第一行为一个整数N。表示数组长度。

接下来一行N个整数表示数组内的数

输出描述:

输出一个整数表示答案

示例1

输入

4

-1 2 3 4

输出

1

示例2

输入

4

1 2 3 4

输出

5

2 解析

合法的元素序列是,索引和nums元素对应,即索引0对应1,索引1对应2,依次递增。

边排序,边判断不合法元素的位置。

不合法的情况有三种:

  • 当前值小于索引
  • 当前值大于索引
  • 当前值与前面的元素重复

3 Python实现

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        n = len(nums)
        i = 0
        while (i<n):
            # 合法的情况:nums中元素与索引对应。索引0对应1,索引1对应2,依次递增
            if nums[i]==i+1:
                i+=1
            '''
            出现不合法情况
            1.nums的当前值小于索引
            2.nums的当前值大于索引
            3.nums当前值出现了重复
            '''
            elif (nums[i]<=i or nums[i]>n or nums[nums[i]-1]==nums[i]):
                n -=1
                nums[i] = nums[n]
            # 表示当前值是一个合法的值,但是没有在理想的位置上,需要进行交换处理
            else:
                temp = nums[i]
                nums[i] = nums[nums[i]-1]
                nums[temp-1] = temp
        return i+1
目录
相关文章
|
25天前
|
算法
LeetCode第53题最大子数组和
LeetCode第53题"最大子数组和"的解题方法,利用动态规划思想,通过一次遍历数组,维护到当前元素为止的最大子数组和,有效避免了复杂度更高的暴力解法。
LeetCode第53题最大子数组和
|
26天前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
LeetCode------找到所有数组中消失的数字(6)【数组】
这篇文章介绍了LeetCode上的"找到所有数组中消失的数字"问题,提供了一种解法,通过两次遍历来找出所有未在数组中出现的数字:第一次遍历将数组中的每个数字对应位置的值增加数组长度,第二次遍历找出所有未被增加的数字,即缺失的数字。
|
26天前
|
前端开发
LeetCode------移动零(5)【数组】
这篇文章介绍了LeetCode上的"移动零"问题,提出了一种使用双指针的原地操作解法,该方法首先将非零元素移动到数组前端并保持相对顺序,然后填充后续位置为零,以达到题目要求。
|
25天前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
12天前
|
存储 数据处理 索引
如何删除 Python 数组中的值?
【8月更文挑战第29天】
19 8
|
12天前
|
索引 Python
向 Python 数组添加值
【8月更文挑战第29天】
22 8
|
12天前
|
存储 缓存 C语言
|
12天前
|
存储 测试技术 Python
Python 数组和列表有什么区别?
【8月更文挑战第29天】
18 4
|
14天前
|
算法 Serverless Python
使用 Python 查找整数中的数字长度
【8月更文挑战第27天】
15 5
下一篇
DDNS