力扣数组类题目--41缺失的第一个正数

这篇具有很好参考价值的文章主要介绍了力扣数组类题目--41缺失的第一个正数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

41 缺失的第一个正数
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案
示例 1:
输入:nums = [1,2,0]
输出:3
示例 2:
输入:nums = [3,4,-1,1]
输出:2
示例 3:
输入:nums = [7,8,9,11,12]
输出:1
方法一:暴力解题,复杂度超出范围

from typing import List
def firstMissingPositive(nums: List[int]) -> int:
    for i in nums:
        if i<0:
            nums.remove(i)
    nums.sort()
    b = []
    for i in range(0,max(nums)+2):
        if i not in nums:
            b.append(i)
    b.sort()
    if b[0]==0:
        b.remove(b[0])
    if b==[]:
        return max(nums)+1
    else:
        return min(b)

nums=[3,4,-1,1,9,-5]
a=firstMissingPositive(nums)
print(a)
#以上方法判定为超出内存限制!!!!

方法二:
没有排序或者暴力循环
总体思路:
1对于一个长度为 N 的数组,其中没有出现的最小正整数只能在 [1,N+1]中。这是因为如果 [1,N] 都出现了,那么答案是 N+1,否则答案是 [1,N] 中没有出现的最小正整数
2我们对数组进行遍历,对于遍历到的数 x,如果它在 [1,N]的范围内,那么就将数组中的第 x−1个位置(注意:数组下标从 0开始)打上「标记」。在遍历结束之后,如果所有的位置都被打上了标记,那么答案是 N+1,否则答案是最小的没有打上标记的位置加 1
3由于我们只在意 [1,N] 中的数,因此我们可以先对数组进行遍历,把不在 [1,N] 范围内的数修改成任意一个大于 N 的数(例如 N+1)。这样一来,数组中的所有数就都是正数了,因此我们就可以将「标记」表示为「负号」
力扣数组类题目--41缺失的第一个正数,python,leetcode,算法,数据结构

from typing import List
def firstMissingPositive(nums: List[int]) -> int:
    n = len(nums)
    for i in range(n):
        if nums[i] <= 0:
            nums[i] = n + 1
    print(nums)
    #凡是0和负数都变为n+1#[3, 4, 7, 1, 9, 7],因为这里面7和9数字大于n=6,
    #后面都会忽略处理它们,因为缺失的第1个正整数不可能是它们.
    #除非[1,n]都出现了,那么缺失的第1个正整数会是n+1见下面的return
    for i in range(n):
        num = abs(nums[i])
        #依次处理nums中的值,注意由于下面的处理nums中的值一直在变化
        # #但是nums中各个值的绝对值是不变的
        print("num:",num)
        #核心思路:不管nums如何变化这里num依次取到的值依然是3, 4, 7, 1, 9, 7
        # num为3时把第2个位置的数字改为第2个位置中的数字的负数即把7变为-7
        #即后面处理的依然可以取到7这个数字,
        #又在[1,n]中3处在第3个位置,也就是python列表的第2个位置,这里把第2个位置7标为负数
        #意味着第2个位置标记为负数了,则第2个位置上数即2+1=3,即3不可能是缺失的第1个正整数
        if num <= n:
            nums[num - 1] = -abs(nums[num - 1])
            print("nums:",nums)#
    for i in range(n):
        if nums[i] > 0:
            return i + 1
    return n + 1

nums=[3,4,-1,1,9,-5]
a=firstMissingPositive(nums)
print(a)#a的范围肯定在[1,n+1]之间

方法三、文章来源地址https://www.toymoban.com/news/detail-673136.html

到了这里,关于力扣数组类题目--41缺失的第一个正数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • LeetCode 41 缺失的第一个正数

    LeetCode 41 缺失的第一个正数

    缺失的第一个正数 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 示例 2: 示例 3: 提示: 1 = nums.length = 5 * 105 -231 = nums[i] = 231 - 1 如果本题没有额外的时空复杂度要求

    2024年01月17日
    浏览(8)
  • Leetcode41缺失的第一个正数

    Leetcode41缺失的第一个正数

    思路:原地哈希表 长度为N的数组,没有出现过的正整数一定是1~N+1中的一个。 此时会思考能不能用一个哈希表来保存出现过的1~N+1的数,然后从 1 开始依次枚举正整数,并判断其是否在哈希表中 但是题目要求常数级别的空间,就不能使用N的哈希表了。 这里将原数组当做哈

    2024年02月05日
    浏览(5)
  • LeetCode_原地哈希_困难_41.缺失的第一个正数

    给你一个未排序的整数数组 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 = nu

    2024年02月03日
    浏览(8)
  • 算法---缺失的第一个正数

    算法---缺失的第一个正数

    给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 借用map 就可以实现,但是如果不借用map,在原空间上,也可以实现,不过想要使用原来的数据,会有侵略性,会把原来的数据修改掉。 方法一: 方法二: 算法是很看一个人的思维逻辑的,所以很多

    2024年02月06日
    浏览(6)
  • 【leetcode】缺失的第一个正数 hashmap

    【leetcode】缺失的第一个正数 hashmap

    先把数组里面的正数i都取出来,放到对应的arr[i]=1 然后遍历arr,如果不为1,那么就返回i

    2024年01月19日
    浏览(5)
  • 84.在排序数组中查找元素的第一个和最后一个位置(力扣)

    84.在排序数组中查找元素的第一个和最后一个位置(力扣)

    目录 问题描述 代码解决以及思想  知识点  初始化左边界 left 为数组的起始位置(0),右边界 right 为数组的结束位置( nums.size() - 1 )。 进入一个循环,只要左边界 left 不大于右边界 right ,就执行以下操作: a. 计算中间位置 middle ,这是为了进行二分查找,以避免整数溢

    2024年02月06日
    浏览(12)
  • 在排序数组中查找元素的第一个和最后一个位置——力扣34

    在排序数组中查找元素的第一个和最后一个位置——力扣34

    题目描述 法一 二分查找

    2024年02月14日
    浏览(13)
  • 力扣热门算法题 349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码

    力扣热门算法题 349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码

    349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码,每题做详细思路梳理,配套PythonJava双语代码, 2024.04.02 可通过leetcode所有测试用例。 目录 349. 两个数组的交集 解题思路 完整代码 Python Java 387. 字符串中的第一个唯一字符 解题思路 完整代码 Python Java

    2024年04月08日
    浏览(14)
  • 力扣--数组类题目27. 移除元素

    给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 示例 1: 输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2] 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例

    2024年02月11日
    浏览(5)
  • 打卡一个力扣题目

    目录 一、问题 二、解题办法一 三、解题方法二 四、对比分析 关于 ARTS 的释义 —— 每周完成一个 ARTS: ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Share: 分享一篇有观点和思考的技术文章 希望通

    2024年02月15日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包