每日一题——Python代码实现力扣1. 两数之和(举一反三+思想解读+逐步优化)五千字好文


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

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

Python-3.12.0文档解读

目录

菜鸡写法

代码分析

时间复杂度分析

空间复杂度分析

改进建议

我要更强

方法1: 使用哈希表(字典)

方法2: 排序和双指针

方法3: 使用集合(仅适用于特殊情况)

哲学和编程思想

1. 空间与时间的权衡(Space-Time Tradeoff)

2. 分治法(Divide and Conquer)

3. 迭代与递归

4. 数据结构的选择

5. 算法优化

6. 抽象与具体化

7. 代码的可读性与效率

举一反三

1. 空间与时间的权衡

2. 分治法

3. 迭代与递归

4. 数据结构的选择

5. 算法优化

6. 抽象与具体化

7. 代码的可读性与效率


题目链接:https://leetcode.cn/problems/two-sum/description/

菜鸡写法

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:len_nums=len(nums)for i in range(len_nums):for j in range(len_nums):if i==j:continueif nums[i]+nums[j]==target:return [i,j]

这段代码是一个Python类Solution的方法twoSum,其目的是在给定的整数列表nums中找到两个数,使得这两个数的和等于给定的目标值target。如果找到这样的两个数,方法返回一个包含这两个数索引的列表;如果没有找到,理论上应该返回一个特定的值(如None或[-1, -1]),但这段代码在找到解后立即返回,没有处理无解的情况。

代码分析

  1. 循环结构:代码使用了两个嵌套的循环来遍历列表nums。外层循环从第一个元素遍历到最后一个元素,内层循环同样从第一个元素遍历到最后一个元素。
  2. 条件判断:在内层循环中,首先通过if i==j来跳过自身与自身相加的情况,然后通过if nums[i]+nums[j]==target来检查两个数的和是否等于目标值。
  3. 返回结果:一旦找到满足条件的两个数,立即返回它们的索引。

时间复杂度分析

由于使用了两个嵌套的循环,每个循环都遍历整个列表,因此时间复杂度为O(n^2),其中n是列表nums的长度。这是因为对于列表中的每一个元素,都需要与其他所有元素进行比较。

空间复杂度分析

空间复杂度为O(1),因为除了输入的列表和几个变量(如索引和循环控制变量)外,没有使用额外的数据结构来存储信息。所有的操作都是基于原始列表进行的。

改进建议

这段代码的时间复杂度较高,可以通过使用哈希表(在Python中为字典)来优化。使用哈希表可以在一次遍历中找到解,时间复杂度可以降低到O(n)。


我要更强

方法1: 使用哈希表(字典)

这是最常见的优化方法,通过使用哈希表来存储元素及其索引,可以在一次遍历中找到解。

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:num_to_index = {}for i, num in enumerate(nums):complement = target - numif complement in num_to_index:return [num_to_index[complement], i]num_to_index[num] = ireturn None  # 如果没有找到,返回None

时间复杂度: O(n),其中n是列表nums的长度。我们只遍历了一次列表。 空间复杂度: O(n),因为我们需要一个哈希表来存储元素及其索引。

方法2: 排序和双指针

这种方法首先对数组进行排序,然后使用两个指针分别从头部和尾部开始移动,直到找到解。

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:sorted_indices = sorted(range(len(nums)), key=lambda x: nums[x])left, right = 0, len(nums) - 1while left < right:sum_ = nums[sorted_indices[left]] + nums[sorted_indices[right]]if sum_ == target:return [sorted_indices[left], sorted_indices[right]]elif sum_ < target:left += 1else:right -= 1return None  # 如果没有找到,返回None

时间复杂度: O(n log n),主要来自于排序操作。 空间复杂度: O(n),因为我们需要一个额外的列表来存储排序后的索引。

方法3: 使用集合(仅适用于特殊情况)

如果数组中的数字都是正数且范围有限,我们可以使用集合来存储所有可能的差值,然后检查这些差值是否存在于数组中。

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:if all(isinstance(num, int) and num >= 0 for num in nums):possible_diffs = set()for num in nums:if num in possible_diffs:return [target - num, num]possible_diffs.add(target - num)return None  # 如果没有找到,返回None

时间复杂度: O(n),遍历了一次数组。 空间复杂度: O(n),因为需要一个集合来存储所有可能的差值。

这些方法提供了不同的优化策略,可以根据具体问题的要求和限制选择最合适的方法。


哲学和编程思想

这些优化方法体现了多种哲学和编程思想,包括但不限于:

1. 空间与时间的权衡(Space-Time Tradeoff)

  • 哈希表方法:通过使用额外的空间(哈希表)来存储已经遍历过的元素及其索引,减少了时间复杂度。这是一种典型的空间换时间的策略。
  • 排序和双指针方法:虽然这种方法需要额外的空间来存储排序后的索引,但它通过排序和双指针的策略,有效地减少了查找匹配对的时间。

2. 分治法(Divide and Conquer)

  • 排序和双指针方法:这种方法通过将数组分为两部分,并从两端向中间移动指针,利用了分治的思想。通过比较和调整指针位置,逐步缩小搜索范围,直到找到解。

3. 迭代与递归

  • 所有方法:这些方法都使用了迭代而非递归,通过循环结构来遍历数组或集合,这是编程中常用的控制结构,可以有效地处理大量数据。

4. 数据结构的选择

  • 哈希表方法:选择哈希表作为数据结构是因为它提供了快速的查找操作(平均时间复杂度为O(1)),这对于需要在遍历过程中快速查找元素的情况非常有效。
  • 排序和双指针方法:使用排序后的索引列表和双指针,利用了排序后数组的特性,即相邻元素的顺序关系,来加速查找过程。

5. 算法优化

  • 哈希表方法:通过在遍历过程中即时检查目标值的补数是否已存在于哈希表中,避免了不必要的重复计算。
  • 排序和双指针方法:通过排序和双指针的策略,避免了遍历整个数组,减少了比较的次数。

6. 抽象与具体化

  • 所有方法:这些方法都体现了从具体问题(找到两个数使其和为目标值)到抽象算法(使用哈希表、排序和双指针等)的转换,这是编程中解决问题的关键步骤。

7. 代码的可读性与效率

  • 所有方法:在编写代码时,不仅要考虑算法的效率,还要考虑代码的可读性和维护性。这些方法都尽量保持代码简洁明了,易于理解和修改。

通过这些方法,可以看到编程不仅仅是技术操作,更是一种结合了逻辑思维、数学原理和工程实践的艺术。每种方法都体现了对问题本质的深刻理解和创新思维的应用。


举一反三

理解并应用这些哲学和编程思想可以帮助在面对新的编程问题时举一反三。以下是一些技巧和建议:

1. 空间与时间的权衡

  • 分析问题:在解决问题时,首先分析是否可以通过增加空间复杂度来减少时间复杂度。例如,使用缓存或哈希表来存储中间结果,以避免重复计算。
  • 优化策略:在时间和空间之间找到平衡点。如果内存不是问题,考虑使用更多的空间来加速程序运行。

2. 分治法

  • 分解问题:将复杂问题分解为更小的、易于管理的部分。例如,在处理大数据集时,可以将数据集分成几个部分,分别处理后再合并结果。
  • 递归应用:对于可以自然分解为子问题的问题,考虑使用递归算法。确保理解递归的终止条件和如何组合子问题的解。

3. 迭代与递归

  • 选择合适的控制结构:根据问题的性质选择迭代或递归。迭代通常更高效,而递归可以使代码更简洁和直观。
  • 优化递归:如果递归导致性能问题,考虑将其转换为迭代形式,或者使用尾递归优化。

4. 数据结构的选择

  • 了解数据结构:熟悉不同数据结构的优缺点,如数组、链表、栈、队列、树、图、哈希表等。
  • 选择合适的数据结构:根据问题的需求选择最合适的数据结构。例如,如果需要频繁查找,哈希表可能是一个好选择。

5. 算法优化

  • 预处理数据:如果可能,对数据进行预处理,如排序,以加速后续的查找或比较操作。
  • 避免不必要的计算:在循环中,确保不会重复计算相同的结果。使用缓存或记忆化技术存储中间结果。

6. 抽象与具体化

  • 抽象问题:将具体问题抽象为更一般的模型,这有助于找到通用的解决方案。
  • 具体化解决方案:在找到抽象解决方案后,将其具体化以适应特定问题的细节。

7. 代码的可读性与效率

  • 编写清晰代码:始终编写清晰、有条理的代码,即使这可能需要更多的代码行。清晰的代码更容易维护和调试。
  • 性能优化:在确保代码可读性的同时,寻找提高性能的机会。使用性能分析工具来识别瓶颈。

通过实践这些技巧,将能够更好地理解问题的本质,并开发出既高效又易于理解的解决方案。记住,编程是一个不断学习和实践的过程,通过不断的练习和挑战,编程技能将得到显著提升。


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

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

相关文章

自然语言处理领域的明星项目推荐:Hugging Face Transformers

在当今人工智能与大数据飞速发展的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;已成为推动科技进步的重要力量。而在NLP领域&#xff0c;Hugging Face Transformers无疑是一个备受瞩目的开源项目。本文将从项目介绍、代码解释以及技术特点等角度&#xff0c;为您深…

气膜建筑:持久耐用的建筑选择—轻空间

随着科技的发展&#xff0c;气膜建筑以其快速施工、节能环保和灵活多用的特点&#xff0c;正在各个领域获得越来越多的应用。然而&#xff0c;许多人对气膜建筑的耐用程度仍存有疑虑。本文将从气膜建筑的材料、结构设计和维护等方面&#xff0c;深入探讨气膜建筑的耐用性&#…

EndNote 21 for Mac v21.3 文献管理软件安装

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行安装EndNote212、升级 三、运行1、打开软件&#xff0c;测试 安装完成&#xff01;&#xff01;&#xff01;四、注意事项 效果 一、下载软件 下载软件 链接&#xff1a;http://www.macfxb.cn 二、开始安装 1、双击…

无霍尔BLDC驱动

目前主要的无霍尔控制方案是基于反电势检测信 息判断换相点,本文研究反电势在 PWM - OFF 点的检 测方案确定换相点。 1. 反电动势检测方案 BLDC 的模型做等效,将线圈阻抗看成是一个 线性电阻和一个储能电感的等效,其等效电路图如图 1所示。 电机三相绕组输出端电压的电压…

Typora + Hexo 图片路径问题(Typedown)

文章目录 1. 冲突来源2. 解决思路3. 实现1. typora图片路径2. hexo脚本 1. 冲突来源 Hexo上对于图片在md中的引用&#xff0c;使用了post_asset_folder: true配置&#xff0c;来更好的管理图片。 当一篇名为xxx.md的文章引用1.png图片时&#xff0c;默认让1.png保持在xxx文件夹…

热电阻温度计的测量电路

热电阻温度计的测量电路&#xff0c;为达到高精度测量&#xff0c;通常会采用电桥测量原理&#xff0c;并结合适当的热电阻类型和连接方式。 惠斯通电桥是用于测量一组电阻式元件阻值变化的电路。该电路具有两个并联电阻支路&#xff0c;充当激励电压 VEXCITATION 的分压器。每…

帕金森综合征的预防方法

帕金森综合征是一种慢性神经退行性疾病&#xff0c;目前尚无法彻底治愈。然而&#xff0c;通过采取一些预防措施&#xff0c;可以降低患病风险或延缓病情发展。以下是一些基于最新研究和医学建议的预防方法&#xff1a; 健康饮食&#xff1a;保持低盐、低脂饮食&#xff0c;多吃…

二叉树经典OJ题

目录 判断两棵二叉树是否相同单值二叉树判断对称二叉树另一棵树的子树二叉树遍历判断完全二叉树 判断两棵二叉树是否相同 力扣上忽然找不到这个题了&#xff0c;大家先看代码吧&#xff1a; 首先要注意的是&#xff0c;两棵树的前序遍历结果一样时&#xff0c;结构可能是不同…

期货交易纪律2024年6月22号

文章目录 期货交易系统构建第一步、选品第二步、开仓纪律第三步、持仓 2024年6月22号&#xff0c;开始写期货交易的第三篇日记。 交易记录&#xff1a;市场继续震荡&#xff0c;这两天无交易&#xff0c;继续梳理一些期货交易选品&#xff0c;周末详细的了解了一下豆粕&#xf…

vue3+element ui +ts 封装周范围选择器

vue3element ui ts 封装周范围选择器 在业务场景中&#xff0c;产品需要在页面中使用周范围选择器&#xff0c;我们在使用ant-design的时候里面是有自带的&#xff0c;但是在emement中只有指定周的范围选择器&#xff1a; 这个是ant-design的周范围选择器 这个是element ui 的…

阿里云推出首个 AI 程序员!

AI圈最近又发生了啥新鲜事&#xff1f; 该栏目以周更频率总结国内外前沿AI动态&#xff0c;是快速了解AI发展趋势一个不错的方式&#xff0c;感兴趣的可以点击订阅合集以及时收到最新推送 DeepSeek Coder V2开源发布&#xff0c;首超GPT4-Turbo的代码能力 全球首个在代码、数…

(经验)高考填报志愿,有哪些坑你需要避开?

高考年年考&#xff0c;填报志愿的却年年都是新手.....哪些关于高考填报志愿的坑&#xff0c;依旧还继续坑....是时候做些改变了。过来人写的几点避坑&#xff0c;希望给这届新人做参考。 1、不要什么热门就报什么&#xff0c;因为有些东西别人学得很快&#xff0c;而我慢的像蜗…

物联网系统运维——移动电商应用发布,Tomcat应用服务器,实验CentOS 7安装JDK与Tomcat,配置Tomcat Web管理界面

一.Tomcat应用服务器 1.Tomcat介绍 Tomcat是- -个免费的开源的Ser Ivet容器&#xff0c;它是Apache基金会的Jakarta 项目中的一个核心项目&#xff0c;由Apache&#xff0c; Sun和其他一 些公司及个人共同开发而成。Tomcat是一一个小型的轻量级应用服务器&#xff0c;在中小型…

23.并发

目录 一、一些概念二、进程和线程2.1 概念2.2 多线程导致的问题2.3 使用spawn创建新线程2.4 线程与move闭包 三、消息传递3.1 概念3.2 创建通道3.3 示例3.4 其它测试 四、共享状态并发4.1 互斥器4.2 Mutex的API4.3 多线程共享Mutex1&#xff09;在多线程之间共享值&#xff1b;…

Pikachu靶场--CRSF

借鉴参考 CSRF跨站请求伪造&#xff08;CTF教程&#xff0c;Web安全渗透入门&#xff09;_bilibili pikachu靶场CSRF之TOKEN绕过_csrf token绕过的原理-CSDN博客 CSRF(get) 发现需要登录 查看提示&#xff0c;获取username和password 选择一个用户进行登录 选择修改个人信息 …

基于SpringBoot+Vue汽车配件销售管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

【设计模式-04】原型模式

【设计模式-04】原型模式 1. 概述2. 结构3. 实现4. 案例5. 使用场景6. 优缺点6.1 原型模式的优点6.2 原型模式的缺点 7. 实现深克隆(深拷贝) 1. 概述 原型模式: 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 2. 结构 原型…

5.树莓派4b+ubuntu18.04(ros版本melodic)+arduino mega自制两轮差速小车,实现建图导航功能

这一节介绍雷达的使用&#xff0c;我们使用的雷达型号是ydlidar x3 1.进入工作空间 cd catkin_ws/src2.下载官方提供的SDK文件 git clone https://github.com/YDLIDAR/YDLidar-SDK.git3.安装cmake sudo apt install cmake pkg-config4.编译和安装 进入YDLidar-SDK文件夹后如…

在线随机密码生成工具

对于运维工作&#xff0c;经常需要生产随机密码&#xff0c;这里介绍一款在线生成密码工具&#xff0c;支持配置密码组合类型&#xff0c;如数字、字母大小写、特殊字符等&#xff0c;还能排除某些特殊字符。 在线随机密码生成工具 https://tool.hiofd.com/random-string-gen…

SLAM Paper Reading和代码解析

最近对VINS、LIO-SAM等重新进行了Paper Reading和代码解析。这两篇paper和代码大约在三年前就读过&#xff0c;如今重新读起来&#xff0c;仍觉得十分经典&#xff0c;对SLAM算法研发具有十分重要的借鉴和指导意义。重新来读&#xff0c;对其中的一些关键计算过程也获得了更新清…