每日一题——Python实现PAT甲级1144 The Missing Number(举一反三+思想解读+逐步优化)四千字好文

news2024/10/7 20:36:46


一个认为一切根源都是“自己不够强”的INTJ

个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数

Python-3.12.0文档解读

目录

我的写法

时间复杂度分析

空间复杂度分析

总体空间复杂度:O(N)

总结

我要更强

时间复杂度分析

空间复杂度分析

总结

哲学和编程思想

举一反三


题目链接

我的写法

# 接收一个整数N,表示输入的数字个数
N = int(input())

# 从输入中读取N个整数,并将它们转换为集合以去除重复项
nums = set(map(int, input().split()))

# 找出集合中的最大值
max_num = max(nums)

# 如果集合中的最大值小于等于0,那么返回1
if max_num <= 0:
    print('1')
    raise SystemExit(0)  # 提前终止程序,因为我们已经找到了答案

# 从1到最大值之间查找缺失的正整数
for i in range(1, max_num):
    if i not in nums:  # 如果当前数i不在集合中,输出这个数
        print(i)
        raise SystemExit(0)  # 提前终止程序,因为我们已经找到了答案

# 如果1到最大值之间的所有正整数都在集合中,返回最大值+1
print(max_num + 1)

这段代码实现了查找从1开始的最小正整数,该整数不在给定的整数集合中。下面是对这段代码的详细点评和分析:

时间复杂度分析

  • 输入处理:O(N)
    • 将N个数字读取并转换为集合需要O(N)时间。
  • 查找最大值:O(N)
    • 查找集合中的最大值需要遍历所有元素,时间复杂度为O(N)。
  • 检查缺失的正整数:O(max_num)
    • 在最坏情况下,需要从1检查到 max_num,每次检查集合中是否存在某个整数的时间为O(1),因此这一部分的时间复杂度为O(max_num)。
  • 总体时间复杂度:O(N + max_num)
  • 由于 max_num 最多不会超过N,因此时间复杂度可以表示为O(N)(假设输入的N个数字都是正数且没有重复)。

空间复杂度分析

  • 输入处理:O(N)
    • 输入N个数字并存储到集合中,需要O(N)的空间。
  • 其他部分:
  • 使用了几个常数级别的额外变量如 max_num 和 i,这些变量的空间复杂度为O(1)。

总体空间复杂度:O(N)

总结

这段代码高效地查找了最小的缺失正整数,逻辑清晰,处理了多种可能的输入情况。时间复杂度为O(N),空间复杂度也是O(N),对于一般的输入规模是可以接受的。此外,使用集合来存储输入数据,可以快速地进行查找操作,进一步优化了性能。唯一需要注意的是,在极端情况下,如果输入的数字范围非常大,可能会导致较高的空间开销。


我要更强

为了优化时间复杂度和空间复杂度,我们可以考虑以下几个策略:

  1. 使用数组代替集合:如果输入的数字范围有限,可以使用数组来标记数字是否出现,这样可以减少空间使用。
  2. 只关注正整数:我们只关心正整数的缺失,因此可以忽略非正整数,这样可以减少不必要的检查。
  3. 原地修改数组:使用输入的数组本身来标记数字是否出现,这样可以避免额外的空间使用。

下面是使用这些策略优化后的代码:

# 读取输入的数字个数
N = int(input())

# 读取输入的数字,并转换为列表
nums = list(map(int, input().split()))

# 使用一个数组来标记1到N之间的数字是否出现
# 初始化所有位置为False,表示数字未出现
present = [False] * N

# 遍历输入的数字,如果数字在1到N之间,则标记为True
for num in nums:
    if 1 <= num <= N:
        present[num - 1] = True

# 遍历标记数组,找到第一个未被标记的位置,即缺失的最小正整数
for i in range(N):
    if not present[i]:
        print(i + 1)
        raise SystemExit(0)

# 如果所有位置都被标记,则缺失的最小正整数是N+1
print(N + 1)

时间复杂度分析

  • 输入处理:O(N)
  • 标记数字:O(N)
  • 查找缺失的正整数:O(N)
  • 总体时间复杂度:O(N)

空间复杂度分析

  • 标记数组:O(N)
  • 总体空间复杂度:O(N)

总结

这段代码通过使用一个额外的数组来标记数字是否出现,优化了空间复杂度。同时,由于只关注1到N之间的数字,因此可以忽略输入中的非正整数,减少了不必要的检查。这种方法在输入数字的范围有限时非常有效,特别是在输入的数字都是正整数且范围不大于N时,可以达到O(N)的时间复杂度和空间复杂度。


哲学和编程思想

这些优化方法体现了以下哲学和编程思想:

  1. KISS原则(Keep It Simple, Stupid):
    • 代码简洁明了,避免不必要的复杂性。例如,使用数组来标记数字是否出现,而不是使用更复杂的数据结构。
  2. YAGNI原则(You Ain't Gonna Need It):
    • 只实现当前需要的功能,不预先实现未来可能需要的功能。在代码中,我们只处理了当前输入的数字,没有预先考虑更大范围的数字。
  3. 空间与时间的权衡(Space-Time Tradeoff):
    • 在空间和时间之间做出权衡。使用额外的数组来标记数字是否出现,虽然增加了空间复杂度,但减少了时间复杂度,因为可以直接在O(1)时间内检查数字是否出现。
  4. 局部性原理(Principle of Locality):
    • 利用数据的局部性,假设输入的数字集中在一定的范围内。通过限制标记数组的大小为N,我们假设缺失的正整数不会超过N,这在很多实际情况下是合理的。
  5. 抽象与具体化:
    • 将问题抽象为更具体的形式。例如,将查找缺失的最小正整数问题抽象为在数组中查找第一个未被标记的位置。
  6. 优化与效率:
    • 追求代码的效率。通过原地修改数组和使用数组标记,我们减少了不必要的内存分配和数据复制,提高了程序的执行效率。
  7. 问题分解:
    • 将复杂问题分解为更小的、可管理的部分。在代码中,我们将问题分解为读取输入、标记数字和查找缺失数字三个部分。
  8. 算法优化:
    • 选择合适的算法来解决问题。在这个例子中,我们选择了基于数组的标记算法,这是一种简单而高效的方法。
  9. 数据驱动:
  • 根据数据的特性来设计解决方案。由于我们假设输入的数字都是正整数且范围不大于N,因此我们可以设计一个基于这个假设的优化方案。

通过这些哲学和编程思想的应用,能够设计出更加高效、简洁且易于理解的代码。这些思想不仅适用于这个特定的例子,也适用于更广泛的编程和软件开发领域。


举一反三

基于上述哲学和编程思想,以下是一些技巧和策略,可以帮助在编程和问题解决中举一反三:

  1. 简化问题:
    • 在开始编码之前,尝试简化问题。去掉非必要的部分,专注于核心需求。
    • 使用简单的数据结构和算法,避免过早优化。
  2. 避免过度设计:
    • 不要预先实现不需要的功能。根据实际需求逐步构建系统。
    • 保持代码的灵活性和可扩展性,但只在必要时进行扩展。
  3. 权衡时间和空间:
    • 在设计算法时,考虑时间和空间的平衡。有时候,牺牲一点空间可以显著减少时间复杂度。
    • 分析问题的特性,选择最合适的数据结构和算法。
  4. 利用局部性原理:
    • 如果数据具有局部性,考虑使用缓存或预取技术来提高性能。
    • 在处理大量数据时,考虑数据的分块处理,以减少内存使用和提高处理速度。
  5. 抽象问题:
    • 将复杂问题分解为更小的、可管理的部分。每个部分应该有一个清晰的目标和接口。
    • 使用抽象数据类型(ADTs)来隐藏实现细节,提高代码的可读性和可维护性。
  6. 追求效率:
    • 在编码时,始终考虑性能。避免不必要的循环和递归,减少函数调用的开销。
    • 使用合适的数据结构来存储和操作数据,例如使用哈希表进行快速查找。
  7. 问题分解:
    • 将大问题分解为小问题,逐步解决。每个小问题解决后,再整合起来解决整个问题。
    • 使用模块化和分层设计,将代码组织成易于管理和测试的单元。
  8. 算法优化:
    • 学习和掌握常见的算法和数据结构,了解它们的时间和空间复杂度。
    • 在解决问题时,尝试找到最优的算法,或者对现有算法进行改进。
  9. 数据驱动:
  • 分析数据的特性,根据数据的特点选择或设计合适的算法。
  • 在处理数据密集型任务时,考虑数据预处理和后处理步骤,以提高算法的效率。

通过应用这些技巧和策略,可以在编程和问题解决中更加灵活和高效。记住,编程不仅仅是写代码,更是一种思考和解决问题的艺术。


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue】——组件的注册与引用(二)

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

软件加密的基本概念

软件加密作为信息安全领域的一项重要技术&#xff0c;随着数字化时代的到来&#xff0c;其重要性日益凸显。以下是关于软件加密的详细解析&#xff0c;旨在为读者提供全面且深入的了解。 一、软件加密的基本概念 软件加密&#xff0c;简而言之&#xff0c;就是在数据传输、存储…

在windows 台式机电脑部署GLM4大模型

参考这篇文章在windows笔记本电脑部署GLM4大模型_16g显卡本地部署glm4-CSDN博客 我的环境&#xff08;PC台式机电脑&#xff1a; 处理器 Intel(R) Core(TM) i9-14900K 3.20 GHz 机带 RAM 32.0 GB (31.8 GB 可用)、32G内存、NVIDIA RTX4080&#xff08;16G&#xff09;…

使用 ZTM 增强极空间 NAS 的远程访问能力

入手极空间 Z4Pro 快两个周了&#xff0c;使用体验文章还得再等一等&#xff0c;多一些深度体验的时间。到目前来看&#xff0c;还是很满意的。 背景 今天这篇来说说极空间的远程访问功能&#xff0c;产品页面对远程访问的描述是&#xff1a; 让极空间真正成为你家庭中的网络…

6.17 作业

使用qt实现优化自己的登录界面 要求&#xff1a; 1. qss实现 2. 需要有图层的叠加 &#xff08;QFrame&#xff09; 3. 设置纯净窗口后&#xff0c;有关闭等窗口功能。 4. 如果账号密码正确&#xff0c;则实现登录界面关闭&#xff0c;另一个应用界面显示。 第一个源文件 …

Mybatis --- 动态SQL 和数据库连接池

文章目录 一、什么是动态SQL 重要性二、动态SQL的编写 ---注解三、动态SQL的编写 ---xml3.1 增加场景 if标签3.2 处理代码块内容 --- trim 标签3.3 查询场景 where标签3.4 更新场景 set标签3.5 删除场景 <foreach> 循环标签3.6 include、sql标签 代码重复度问题 四、数据…

vue+element-plus完美实现跨境电商商城网站

目录 一、项目介绍 二、项目截图 1.项目结构图 2.首页 3.中英文样式切换 4.金钱类型切换 5.商品详情 6.购物车 7.登录 ​编辑 8.注册 9.个人中心 三、源码实现 1.项目依赖package.json 2.项目启动 3.购物车页面 四、总结 一、项目介绍 本项目在线预览&am…

Matlab基础篇:绘图与可视化

目录 前言 一、二维绘图 二、图形属性设置 三、多图绘制 四、三维绘图 五、绘图技巧 六、绘图的高级技巧 七、实例示范&#xff1a;绘制多功能图形 八、总结 前言 在数据分析和数学建模中&#xff0c;可视化是一个非常关键的步骤。Matlab 提供了丰富的绘图和可视化工…

自主可控数据库沙龙(北京站 |线下| 报名中)

**数据库沙龙**是一个致力于推动数据库技术创新和发展的高端交流平台&#xff0c;旨在增强国内数据库产业的自主可控性和高质量发展。这个平台汇集了学术界和产业界的顶尖专家、学者以及技术爱好者&#xff0c;通过专题演讲、案例分享和技术研讨等丰富多样的活动形式&#xff0…

6月17日(周一)美国股市行情总结:标普纳指齐新高,AI和芯片股尤为出色

标普500指数在六天里第五天上涨&#xff0c;纳指和纳指100均连续六日新高&#xff0c;道指止步四日连跌脱离近两周低位&#xff0c;罗素小盘股指止步两日连跌并脱离六周最低。微软收盘市值仍为美股第一、苹果为第二、英伟达第三&#xff0c;但早盘触及盘中新高的英伟达市值曾超…

你对SSH协议了解吗

SSH&#xff08;Secure Shell&#xff09;协议&#xff0c;作为网络通信领域的一项核心技术&#xff0c;以其卓越的安全性能和广泛的应用范围&#xff0c;成为保障网络通信安全的重要工具。本文将深入剖析SSH协议的工作原理、核心特性以及在现代网络通信中的关键作用&#xff0…

上海亚商投顾:沪指缩量调整 PCB概念股持续爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 大小指数昨日走势分化&#xff0c;沪指全天震荡调整&#xff0c;创业板指午后涨超1%。消费电子板块全天强势&a…

安卓多媒体(音频录播、传统摄制、增强摄制)

本章介绍App开发常用的一些多媒体处理技术&#xff0c;主要包括&#xff1a;如何录制和播放音频&#xff0c;如何使用传统相机拍照和录像&#xff0c;如何截取视频画面&#xff0c;如何使用增强相机拍照和录像。 音频录播 本节介绍Android对音频的录播操作&#xff0c;内容包…

基于GTX的64B66B编码IP生成(高速收发器二十)

点击进入高速收发器系列文章导航界面 1、配置GTX IP 相关参数 前文讲解了64B66B编码解码原理&#xff0c;以及GTX IP实现64B66B编解码的相关信号组成&#xff0c;本文生成64B66B编码的GTX IP。 首先如下图所示&#xff0c;需要对GTX共享逻辑进行设置&#xff0c;为了便于扩展&a…

Apple - Framework Programming Guide

本文翻译自&#xff1a;Framework Programming Guide&#xff08;更新日期&#xff1a;2013-09-17 https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Frameworks.html#//apple_ref/doc/uid/10000183i 文章目录 一、框架编程指南简介…

文件操作(1)(C语言版)

前言&#xff1a; 为什么要学习文件操作&#xff1a; 1、如果大家写过一些代码&#xff0c;当运行结束的时候&#xff0c;这些运行结果将不复存在&#xff0c;除非&#xff0c;再次运行时这些结果才能展现在屏幕上面&#xff0c;就比如之前写过的通讯录。 现实中的通讯录可以保…

商超智能守护:AI监控技术在零售安全中的应用

结合思通数科大模型的图像处理、图像识别、目标检测和知识图谱技术&#xff0c;以下是详细的商超合规监测应用场景描述&#xff1a; 1. 员工仪容仪表监测&#xff1a; 利用图像识别技术&#xff0c;系统可以自动检测员工是否按照规范整理妆容、穿着工作服&#xff0c;以及是否…

Arm和高通的法律之争将扰乱人工智能驱动的PC浪潮

Arm和高通的法律之争将扰乱人工智能驱动的PC浪潮 科技行业高管和专家表示&#xff0c;两大科技巨头之间长达两年的法律大战可能会扰乱人工智能驱动的新一代个人电脑浪潮。 上周&#xff0c;来自微软(Microsoft)、华硕(Asus)、宏碁(Acer)、高通(Qualcomm)等公司的高管在台北举行…

Raylib的贪吃蛇

配置Raylib库 工具链主函数模板Draw: 绘制网格Snake: 初始化Draw&#xff1a;绘制蛇与果Input&#xff1a;移动Logic&#xff1a;游戏主要逻辑Draw: 游戏结束 工具链 mkdir snake cd snakeCMakeLists.txt cmake_minimum_required(VERSION 3.10) project(snake) set(CMAKE_EXP…

深度学习500问——Chapter11:迁移学习(3)

文章目录 11.3 迁移学习的常用方法 11.3.1 数据分布自适应 11.3.2 边缘分布自适应 11.3.3 条件分布自适应 11.3.4 联合分布自适应 11.3.5 概率分布自适应方法优劣性比较 11.3.6 特征选择 11.3.7 统计特征对齐方法 11.3 迁移学习的常用方法 11.3.1 数据分布自适应 数据分布自适…