缺失的第一个正整数:给定一个未排序的整数数组,找出其中未出现的最小正整数

给定一个未排序的整数数组,找出其中未出现的最小正整数。


(本文获得CSDN质量评分【90】)

【学习的细节是欢悦的历程】

  • Python 官网:https://www.python.org/

  • Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……

    地址:https://lqpybook.readthedocs.io/


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


  • My CSDN主页、My HOT博、My Python 学习个人备忘录
  • 好文力荐、 老齐教室
等风来,不如追风去……


给定一个未排序的整数数组
缺失的第一个正整数
(找出其中未出现的最小正整数)


本文质量分:

90
本文地址: https://blog.csdn.net/m0_57158496/article/details/129635313

CSDN质量分查询入口:http://www.csdn.net/qc


目 录

  • ◆缺失的第一个正数
    • 1、题目描述
    • 2、大佬题解
      • 2.1 CV的“原码”
      • 2.2 读不明白算法代码
      • 2.3 弄懂代码
    • 3、我的理解
      • 3.1 借轮“出海”
      • 3.3 衍生解法
      • 3.2 用“in”解题
    • 4、完整源码


◆缺失的第一个正数


1、题目描述

  给你一个未排序的整数数组nums,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常1数级别额外空间的解决方案。

样例 1:

输入:
nums = [1, 2, 0]

输出:
3

样例2:

输入:
nums = [3, 4, -1, 1]

输出:
2

样例 3:

输入:
nums = [7, 8, 9, 11, 12]

输出:
1

提示:

  • 1 <= nums.length <= 5 * 105
  • -231 <= nums[i] <= 231 - 1


回页目录

2、大佬题解


   从大佬的博文中剪来的题解代码,其中while一段以我目前水准读不明白。

2.1 CV的“原码”


class Solution:def firstMissingPositive(self, nums: List[int]) -> int:n = len(nums)for i in range(n):while 1 <= nums[i] <= n and nums[nums[i] - 1] != nums[i]:input(nums) nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]for i in range(n):if nums[i] != i + 1:return i + 1return n + 1

以上这段代码的逻辑:
  “好在题目没说参数空间不可以修改,不说就是默认,我们就用参数的空间。我们把在范围内的正数放在对应的位置,处理完一遍数组后,第二次遍历数组,对应位置数字不对的就是缺失的正数。



def firstMissingPositive(self, nums: List[int]) -> int:pass

  这函数形参的定义语法,我的两个Python环境都“死活”不认。😣
在这里插入图片描述
在这里插入图片描述
  函数定义原语句,修改成了我Python喜欢的样子,才成功跑起来了。

def firstMissingPositive(self, nums) -> int:pass

2.2 读不明白算法代码


  以我目前的Python学识,读不明白那while那一段代码,加了两个print()“显形”,才晓得是起“排序”作用。😝


代码

def firstMissingPositive(self, nums) -> int:n = len(nums)for i in range(n):print(nums) # 添加的调试用语句。while 1 <= nums[i] <= n and nums[nums[i] - 1] != nums[i]:nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]print(nums) # 添加的调试用语句。


效果截屏
在这里插入图片描述

2.3 弄懂代码

  经过仔细拆解,终于读懂大佬算法代码。

  原来大佬说的“……把在范围内的正数放在对应的位置,处理完一遍数组后……”,意思是遍历一遍数组,把<=数组长度len(nums)的正整数放在其对应的正确位置(设定数组第一个位置放1),依次处理每个正整数。nums[nums[i] - 1] != nums[i]的意义是遍历到的数组“元素自己的值减1不等于它自己的下标”,即nums[i] - 1 != i。这个条件表达式,可以换为后面一句的写法,“判定值减1是否等于它的下标”。


class Solution:#def firstMissingPositive(self, nums: List[int]) -> int:def firstMissingPositive(self, nums) -> int:n = len(nums)for i in range(n):print('\n遍历位置:i =', i)#while 1 <= nums[i] <= n and nums[nums[i] - 1] != nums[i]: # 原作者写法。while 0 < nums[i] <= n and nums[i] - 1 != i:print(nums)nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]        print(f"\n{nums}\n") for i in range(n):if nums[i] != i + 1:return i + 1return n + 1

  不得不说,读懂佬的算法代码,才真正体会到算法的精巧,让人叹服。


样例实操:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  样例3给出的整数都大于其长度5,不作处理。第一个位置不是1,1即是未出现过的最小正整数。


回页目录

3、我的理解


  题目要求从给定数组中找出未出现过的最小正整数,正整数即是不含“0”的自然数,那么从1开始升序查找判定就好。首先对数组升序排序(题目描述中没说明不可以用轮子,我认为调用或者自码排序代码,都是可行的),然后截取正数部分比对判定,找出未出现过最小正整数。

3.1 借轮“出海”


  借用list.sort()排正序,enumerate()枚举同时遍历下标和数组元素本身。

代码


def findmin(nums):''' 找出数列中未出现的最小正数 '''nums = [i for i in nums if i > 0] # 列表解析出给定数组的自然数部分。nums.sort() # 排正序。list.sort()默认正序。for k,i in enumerate(nums):if nums[k+1] - 1 != i:return i + 1return i + 1

3.3 衍生解法


  弄明白前面的算法代码,手痒痒的,用算法思想借助list的remove、append帮助,用for一次遍历,if语句改写了前面的算法代码中for下嵌套的while循环体。
  代码虽然臃肿了些,但还是达到了解题的目的,就是处理稍微慢了一些。


def findmin(nums):''' 依佬“变种”,找出数列中未出现的最小正数 '''n = len(nums)for i in nums[:]:k = nums.index(i)if i - 1 != k and 0 < i <= n:nums[i-1], nums[k] = i, nums[i-1]elif i <= 0 or i > n:nums.remove(i)nums.append(i)print(f"\n处理后数组:\n{nums}")for i in nums:if i-1 != nums.index(i):return nums.index(i) + 1return i + 1

在这里插入图片描述


3.2 用“in”解题


  用Python成员判定指令in来解题,无须对nums输入数组排序。用msx(nums)取出最大整数,遍历1~最大整数的整数列表,依次判定在不在数组num中,当i in nums的值为False时,即找到缺失的最小整数。这个算法只需遍历“最小缺失值”次 (从1~n依次遍历),我觉得是“易读易懂”的轻便算法。


代码


def findmin(nums):''' 找出数列中未出现的最小正数 '''for i in range(1, max(nums)):if i not in nums: # not False即是True。return ireturn i+1

  一层for,一个if…elif…,在Python成员判定关键字“in”的助力下完成对输入的处理、输出。
  


回页目录

4、完整源码

(源码较长,点此跳过源码)

#!/sur/bin/nve python
# coding: utf-8def findmin(nums):''' “list.sort()”找出数列中未出现的最小正数 '''nums = [i for i in nums if i > 0] # 列表解析出给定数组的自然数部分。nums.sort() # 排正序。list.sort()默认正序。for k,i in enumerate(nums):if nums[k] != i:return i + 1return i + 1def findmin4(nums):''' 依佬“变种”,找出数列中未出现的最小正数 '''n = len(nums)for i in nums[:]:k = nums.index(i)if i - 1 != k and 0 < i <= n:nums[i-1], nums[k] = i, nums[i-1]elif i <= 0 or i > n:nums.remove(i)nums.append(i)print(f"\n处理后数组:\n{nums}")for i in nums:if i-1 != nums.index(i):return nums.index(i) + 1return i + 1def findmin5(nums):''' “in”,找出数列中未出现的最小正数 '''for i in range(1, max(nums)):if i not in nums: # not False即是True。return iclass Solution:#def firstMissingPositive(self, nums: List[int]) -> int:def firstMissingPositive(self, nums) -> int:n = len(nums)for i in range(n):print('\n遍历位置:i =', i)#while 1 <= nums[i] <= n and nums[nums[i] - 1] != nums[i]:while 0 < nums[i] <= n and nums[i] - 1 != i:print(nums)nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]        print(f"\n{nums}\n") for i in range(n):if nums[i] != i + 1:return i + 1return n + 1if __name__ == '__main__':from time import timeresult = Solution()nums = [1, 2, 0]nums = [3, 4, -1, 1]nums = [7, 8, 9, 11, 12]nums = [8, -1, 5, 4, 1, 3, 2]nums = [4, 3, 2, 1]print('\n输入:')print(*nums)print()start_s = time() # 获取当前时间秒。#print(f"\n输出:\n{result.firstMissingPositive(nums)},程序用时{time() - start_s:.8f}秒。")print(f"\nmy输出:\n{findmin(nums)},程序用时{time() - start_s:.8f}秒。")

回页首

__上一篇:__ 圆桌(CSDN周赛第30期第四题解析)(CSDN周赛第30期第四题,算法解析。)
__下一篇:__ 

我的HOT博:

    • New:ChatGPT初体验(ChatGPT国内镜像站初体验,聊天、Python代码生成。)CSDN质量分92。(30687阅读)
    • 尼姆游戏(彩色文字界面版,\033控制码实现。Linux系统有效。)CSDN质量分xx。(1001阅读)
    • 神奇的 \033 ,让打印出彩(1739阅读)
    • 小炼二维数组(1764阅读)
    • 仿真模拟福彩双色球(2622阅读)
    • Python之魔幻切片(1417阅读)
    • 数列求和a, aa, aaa, ..., aa...aa(n个a)(1729阅读)
    • 个人信息提取(2671阅读)
    • 中文字符命名Python变量和函数(1021阅读)
    • 我的Python学习笔记(1021阅读)
    • 十六进制字符串转Python代码(utf-8字符串转十六进制字符串)(1319阅读)
    • 生成100个随机正整数(2489阅读)
    • 给定字符串提取姓名(字符串、list、re“零宽断言”)(1842阅读)
    • 我的 Python.color() (Python 色彩打印控制)(2370阅读)
    • python清屏(3150阅读)
    • 回车符、换行符和回车换行符(3558阅读)
    • Linux 脚本文件第一行的特殊注释符(井号和感叹号组合)的含义(2301阅读)
    • random.sample()将在python 3.9x后续版本中被弃用(2045阅读)
    • pandas 数据类型之 Series(1809阅读)
    • 聊天消息敏感词屏蔽系统(字符串替换 str.replace(str1, *) )(2332阅读)
    • 练习:银行复利计算(用 for 循环解一道初中小题)(2159阅读)
    • pandas 数据类型之 DataFrame(5932阅读)
    • 班里有人和我同生日难吗?(蒙特卡洛随机模拟法)(2921阅读)
    • Python 续行符(\)“拯救”你的超长语句(1502阅读)
    • Python字符串居中显示(4684阅读)
    • 练习:求偶数和、阈值分割和求差( list 对象的两个基础小题)(2331阅读)
    • 用 pandas 解一道小题(2268阅读)
    • 可迭代对象和四个函数(1752阅读)
    • “快乐数”判断(1847阅读)
    • 罗马数字转换器(构造元素取模)(3157阅读)
    • Hot:罗马数字(转换器|罗生成器)(5783阅读)
    • Hot:让QQ群昵称色变的代码(49777阅读)
    • Hot:斐波那契数列(递归| for )(4719阅读)
    • 柱状图中最大矩形(2348阅读)
    • 排序数组元素的重复起止(1964阅读)
    • 电话拨号键盘字母组合(2170阅读)
    • 密码强度检测器(3124阅读)
    • 求列表平衡点(2498阅读)
    • Hot:字符串统计(4581阅读)
    • Hot:尼姆游戏(聪明版首发)(4135阅读)
    • 尼姆游戏(优化版)(1968阅读)

    • 推荐条件 点阅破千


      回页首


      老齐漫画头像

      精品文章:

      • 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
      • OPP三大特性:封装中的property
      • 通过内置对象理解python'
      • 正则表达式
      • python中“*”的作用
      • Python 完全自学手册
      • 海象运算符
      • Python中的 `!=`与`is not`不同
      • 学习编程的正确方法

      来源:老齐教室


      回页首

      ◆ Python 入门指南【Python 3.6.3】


      好文力荐:

      • 全栈领域优质创作者——寒佬(还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是学习的两大利器。

      • 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛

      • 靠谱程序员的好习惯


      CSDN实用技巧博文:

      • 8个好用到爆的Python实用技巧
      • python忽略警告
      • Python代码编写规范
      • Python的docstring规范(说明文档的规范写法)

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/9496.html

    如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    单词长度统计,统计数据放入列表

    输入一段英文计算每个单词长度&#xff0c;统计不含非英文字符&#xff0c;列表输出。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址…

    换零钱——最小钱币张数(贪心算法)

    贪心算法&#xff1a;根据给定钱币面值列表&#xff0c;输出给定钱币金额的最小张数。 (本笔记适合学完python基本数据结构&#xff0c;初通 Python 的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣…

    换零钱II:零钱面值动态变化,class方法自动兑换最少零钱(贪心算法)

    银行现存零钱面值种类动态变化但数量无限&#xff0c;类方法change()完成指定金额的最少零钱个数兑换。 (本笔记适合学透python基本数据结构&#xff0c;熟悉class的基构造&#xff0c;对类内全局变量有一定认的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1…

    字符串列表分类求平均值

    给定一字符串列表数据&#xff0c;按颜色分类计算价格平均值并写入列表。 (本笔记适合对python字符串和列表基本烂熟的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程…

    BCD码与二进制码的区别与联系

    二进制数是整串二进制编码表示一个整数&#xff0c;BCD码是用二进制码逐一表示0&#xff5e;9的整数。 (本笔记适合对整数进制编码有一定了解&#xff0c;熟悉二进制数编码的编程爱好的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org…

    比对Excel数据

    以a个为准绳比对b表数据&#xff0c;添加比对结果列输出。 (本笔记适合初通 Python 的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么…

    我在CSDN的736个日子——两年纪念日“随想”

    2021-05-21~2023-05-27&#xff0c;我在 CSDN 已有 736 个日子。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址&#xff1a;https:/…

    圆桌:满足客人空座需求,准备最少的椅子,合理安排客人入座圆桌

    CSDN周赛第30期第四题算法解析。 (本文获得CSDN质量评分【90】) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址&#xff1a;https://…

    re.findall获取CSDN博文阅读点赞收藏和评论实时数据

    学用curl命令获取博文页面源码&#xff0c;学不会爬虫先用re.findall手剥CSDN博文阅读点赞收藏和评论实时数据。 (本文获得CSDN质量评分【92】) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完…

    GitLab账号初始密码忘记了, 如何重置?

    如果GitLab对接了类似于LDAP这种统一用户管理系统&#xff0c;可以直接在LDAP中修改。 前两天在通过Terraform 部署的GitLab实例中&#xff0c; 初始的账号密码文件/etc/gitlab/initial_root_password是有时效性的&#xff0c; 需要及时获取初始密码然后进行修改。&#xff08;…

    git账号忘记(重置)密码操作

    目录 1、使用场景 2、实践操作 2.1、在Idea环境之中修改 2.2、最有效修改方式(直接修改windows凭据) 3、成果展现 4、总结 5、参考文章 1、使用场景 最近在使用腾讯的coding&#xff0c;搞个自己的演示demo&#xff0c;因为家事及各种原因&#xff1b;有一段时间未动代码…

    chatgpt赋能python:Python实现计算器:从入门到实现

    Python实现计算器&#xff1a;从入门到实现 计算器是计算机科学中最基础并且实用的东西之一。Python作为一种高级编程语言&#xff0c;它可以用于编写一个功能完整的计算器。在本文中&#xff0c;我们将介绍Python如何实现一个简单的、交互式的计算器&#xff0c;通过使用基本…

    chatgpt赋能python:PythonUDF-知道这些你就能轻松实现自己的需求

    Python UDF - 知道这些你就能轻松实现自己的需求 如果你是一名Python开发者&#xff0c;你肯定知道Python的强大和适用性。在数据分析、机器学习和Web应用程序等领域&#xff0c;Python的使用已经成为了常态。Python的一个重要特点是拥有大量的库和框架&#xff0c;这些库和框…

    用python代码实现的算法题

    每天进步一点点&#xff0c;关注我们哦&#xff0c;每天分享测试技术文章 本文章出自【码同学软件测试】 码同学公众号&#xff1a;自动化软件测试 码同学抖音号&#xff1a;小码哥聊软件测试 01 算法题一 面试题&#xff1a;假设有一个字符串&#xff0c;每个英文单词全部都…

    1行Python代码,对话ChatGPT,网友:太方便了

    大家好&#xff0c;这里是程序员晚枫。 最近ChatGPT火爆全球&#xff0c;哪怕你不是程序员&#xff0c;应该也听过他的大名了。 今天我们就来一起体验一下~1行Python代码就够了&#xff01; 上代码 导入poai这个库后&#xff0c;只需要1行代码poai.chatgpt.chat&#xff0c…

    chatgpt赋能python:Python怎么免费用的?

    Python 怎么免费用的&#xff1f; Python 是一种高级编程语言&#xff0c;自带简洁优美的语法和强大的开发库。因此&#xff0c;它成为了各种应用程序、网站和服务的主要编程语言之一。如果你对编程语言有些了解&#xff0c;那么你应该知道 Python 很适合开发各类工具、脚本和…

    比chatgpt稍逊的ai问答网站phind,专用于编写代码

    介绍&#xff1a; Phind智能网站是一款基于人工智能技术的搜索引擎&#xff0c;提供智能搜索、语音搜索、图像搜索等多种搜索方式。Phind智能网站的搜索结果不仅仅是关键词匹配&#xff0c;更是根据用户的搜索习惯和兴趣推荐相关内容&#xff0c;为用户提供更加个性化的搜索体…

    一分钟学会怎么让chatGPT帮你写python代码(含使用地址)

    一分钟学会怎么让chatGPT帮你写python代码&#xff08;含使用地址&#xff09; 我们用chatGPT做一个python的计算器脚本为例 提出需求 1、给定角色定位 2、提出要求 3、提出要求的细节 标题等待片刻&#xff0c;等待chatGPT生成脚本即可 import tkinter as tkclass Calc…

    为什么要学习Python呢?有了 ChatGPT 还有必要学习 python 吗?

    为什么学习Python呢&#xff1f; 学习 Python 的原因有很多&#xff0c;以下是一些常见的原因&#xff1a; 简单易学&#xff1a; Python 是一门易于学习的编程语言&#xff0c;语法简单、清晰明了&#xff0c;可以快速掌握基本的编程概念。应用广泛&#xff1a; Python 是一…

    Python爬取某平台付费文档,确定不来薅羊毛吗?

    导语&#xff1a; 哈喽&#xff0c;哈喽~当代大学生写作业时&#xff0c;emmmm…先看一眼&#xff0c;ok有点印象。 想翻书时&#xff0c;这是第几页&#xff1f;怎么这么干净&#xff0c;是这里吗… 这时“学小易”就很友好了&#xff0c;但是唯一不足的一点是&#xff0c;…