力扣数组类题目--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. 缺失的第一个正数

    给你一个未排序的整数数组 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月15日
    浏览(32)
  • Leetcode41缺失的第一个正数

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

    2024年02月05日
    浏览(29)
  • 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日
    浏览(29)
  • 算法---缺失的第一个正数

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

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

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

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

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

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

    题目描述 法一 二分查找

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

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

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

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

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

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

    2024年02月15日
    浏览(27)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包