两数之和:找出给定数组中和是给定目标整数的两个整数,输出找到的两个整数下标
找出给定数组中和是给定目标整数的两个整数,输出找到的两个整数下标。
(本文获得CSDN质量评分【90】)
【学习的细节是欢悦的历程】
Python 官网:https://www.python.org/
Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
—— 华罗庚
- My CSDN主页、My HOT博、My Python 学习个人备忘录
- 好文力荐、 老齐教室
找出给定数组中和是给定目标整数的两个整数 两数之和 (输出找到的两个整数下标)
本文质量分:
【 90 】 本文地址: https://blog.csdn.net/m0_57158496/article/details/128608287
CSDN质量分查询入口:http://www.csdn.net/qc
目 录
- ◆ 两数之和
- 1、题目
- 1.1 题目描述
- 1.2 输入输出示例
- 1.3 代码运行效果截屏
- 2、两层for循环的常规算法
- 2.1 能实现代码
- 2.2 优化代码
- 3、用enumerate秀一下常规算法
- 4、借助dict一次遍历的优化算法
- 5、代码试炼——结果输出
- 6、完整源码
◆ 两数之和
回页目录
1、题目
1.1 题目描述
给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
1.2 输入输出示例
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
输入:nums = [3,2,4], target = 6
输出:[1,2]
输入:nums = [3,3], target = 6
输出:[0,1]
输入:nums = [2, 7, 3, 8, 43, 12, 15, 5], target = 13
输出:[3, 7]
1.3 代码运行效果截屏
用两个整数(和为target的两个整数)在数组最后也就是最坏情况试炼。
能实现代码:
优化代码
优化算法代码:
显而易见,算法优化的效果,更显著于代码优化。
回页目录
2、两层for循环的常规算法
一般运用两层遍历,常规算法。用数组中的每一个数和数组中的数依次试炼,查找符题的两个整数下标。
2.1 能实现代码
题目中说明,nums有且仅有一组两数和等于target。所以当找到后,就可以return直接返回两数下标,结束遍历工作。
def sum_two_number(nums, target):''' 输出nums中两数和为target的下标 '''n = len(nums)for i in range(n):for j in range(1, n):if nums[i] + nums[j] == target and i != j:return [i, j] # 题目中说明,nums有且仅有一组两数和等于target。所以找到后就可以直接返回两数下标,结束遍历工作。
2.2 优化代码
第二层for循环,只遍历i后的整数即可(从i+1开始遍历),i前的整数已经遍历过,重复遍历就是空耗浪费。
def sum_two_number(nums, target):''' 输出nums中两数和为target的下标 '''n = len(nums)for i in range(n):for j in range(i+1, n): # 只遍历i后的整数,i前的整数已经遍历。if nums[i] + nums[j] == target and i != j:return [i, j] # 题目中说明,nums有且仅有一组两数和等于target。所以找到后就可以直接返回两数下标,结束遍历工作。
回页目录
3、用enumerate秀一下常规算法
enumerate,Python内建枚举函数,可以以元组 (tuple,(下标, 元素))的形式同时遍历数组的元素和下标。
def sum_two_number5(nums, target):''' 输出nums中两数和为target的下标 '''n = len(nums)k = 0for i in enumerate(nums):for j in enumerate(nums):k += 1if not j[0] > i[0]:continue # 第一层for遍历过的整数,直接跳过。if i[1] + j[1] == target:print(f"\n{'':>17}程序遍历了{k}次。\n{'':~^50}\n")return [i[0], j[0]] # 题目中说明,nums有且仅有一组两数和等于target。所以找到后就可以直接返回两数下标,结束遍历工作。
也可以把“第二层for遍历循环用if直接跳过 (continue)已遍历过的整数”,用条件判断语句 (j != i ,比较遍历到的整数(下标和元素),相同于上层for遍历循环,即是已操作过的整数)连接 (and)在下一个if一起判断。
def sum_two_number(nums, target):''' 输出nums中两数和为target的下标 '''n = len(nums)k = 0for i in enumerate(nums):for j in enumerate(nums):k += 1if i[1] + j[1] == target and j != i:print(f"\n{'':>17}程序遍历了{k}次。\n{'':~^50}\n")return [i[0], j[0]] # 题目中说明,nums有且仅有一组两数和等于target。所以找到后就可以直接返回两数下标,结束遍历工作。
以上两段代码,完全等效。
回页目录
4、借助dict一次遍历的优化算法
借助Python的字典dict,实现一次for遍历的优化算法。
题目中说明“有且仅有”一组符合要求的两个整数,把当前遍历的整数作为第一个数,另一个整数即是target-nums[i]。在字典nums_index中查找另一个整数,如果没有,将当前遍历的整数追加到字典,因为当前整数可能是“另一个”整数。
这样子,最坏情况也就是遍历到数组最后一个整数,也就是是遍历n次(n=len(nums))。
def sum_two_number(nums, target):''' 输出nums中两数和为target的下标 '''nums_index = {} # 初始化整数-下标字典。for i in range(len(nums)):# 当前下标对应整数与目标整数的差值(即第二个整数),不在字典nums_index中,将当前整数以(整数, 下标)键值对放入字典。if target - nums[i] not in nums_index:nums_index[nums[i]] = i#print(nums_index) 调试用语句。else: # 如果当前下标对应整数与目标整数差值在字典nums_index中,即找到第二个整数。返回字典中差值为key的value(下标)和当前下标。return [nums_index.get(target - nums[i]), i]
回页目录
5、代码试炼——结果输出
除了题目中的数组,还增加了一个“最坏情况”数组试炼。加入k变量计算遍历次数,就得到了本文开头的代码运行效果截屏图片(可点击蓝色文字跳转),查看代码运行效果截屏图片。
# 结果输出。
if __name__ == '__main__':nums, target = [2, 7, 11, 15], 9nums, target = [3, 2, 4], 6nums, target = [3, 3], 6nums, target = [2, 7, 3, 43, 12, 15, 5, 8], 13s = '给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。'print(f"\n{' 两数之和 ':=^46}\n\n{'':>4}{s}\n{'':~^50}\n\n\n{'':>2}nums = {nums}, target = {target}\n{'':~^50}")result = f"{'':>18}result = {sum_two_number(nums, target)}\n\n{'':=^50}\n"print(result)
回页目录
6、完整源码
(源码较长,点此跳过源码)
#!/sur/bin/nve python
# coding: utf-8# 一、两层遍历,常规算法。
def sum_two_number(nums, target):''' 输出nums中两数和为target的下标 '''n = len(nums)k = 0for i in range(n):for j in range(i+1, n): # 只遍历i后的整数,i前的整数已经遍历。k += 1if nums[i] + nums[j] == target:print(f"\n{'':>17}程序遍历了{k}次。\n{'':~^50}\n")return [i, j] # 题目中说明,nums有且仅有一组两数和等于target。所以找到后就可以直接返回两数下标,结束遍历工作。def sum_two_number5(nums, target):''' 输出nums中两数和为target的下标 '''n = len(nums)k = 0for i in enumerate(nums):for j in enumerate(nums):k += 1if not j[0] > i[0]:continue # 第一层for遍历过的整数,直接跳过。if i[1] + j[1] == target:print(f"\n{'':>17}程序遍历了{k}次。\n{'':~^50}\n")return [i[0], j[0]] # 题目中说明,nums有且仅有一组两数和等于target。所以找到后就可以直接返回两数下标,结束遍历工作。def sum_two_number(nums, target):''' 输出nums中两数和为target的下标 '''n = len(nums)k = 0for i in enumerate(nums):for j in enumerate(nums):k += 1if i[1] + j[1] == target and j != i:print(f"\n{'':>17}程序遍历了{k}次。\n{'':~^50}\n")return [i[0], j[0]] # 题目中说明,nums有且仅有一组两数和等于target。所以找到后就可以直接返回两数下标,结束遍历工作。# 二、借助dict,一次遍历。
def sum_two_number2(nums, target):''' 输出nums中两数和为target的下标 '''nums_index = {} # 初始化整数-下标字典。k = 0 # 初始遍历次数。for i in range(len(nums)):# 当前下标对应整数与目标整数的差值(即第二个整数),不在字典nums_index中,将当前整数以(整数, 下标)键值对放入字典。if target - nums[i] not in nums_index:nums_index[nums[i]] = ik += 1#print(nums_index) 调试用语句。else: # 如果当前下标对应整数与目标整数差值在字典nums_index中,即找到第二个整数。返回字典中差值为key的value(下标)和当前下标。print(f"\n{'':>17}程序遍历了{k+1}次。\n{'':~^50}\n")return [nums_index.get(target - nums[i]), i]'''
结果输出。
我共用输出语句,想看哪个哪个函数输出效果,将写在她后面的函数名称后加个字符,不让其覆盖她(重置、重写)就好。
'''
if __name__ == '__main__':nums, target = [2, 7, 11, 15], 9nums, target = [3, 2, 4], 6nums, target = [3, 3], 6nums, target = [2, 7, 3, 43, 12, 15, 5, 8], 13s = '给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。'print(f"\n{' 两数之和 ':=^46}\n\n{'':>4}{s}\n{'':~^50}\n\n\n{'':>2}nums = {nums}, target = {target}\n{'':~^50}")result = f"{'':>18}result = {sum_two_number(nums, target)}\n\n{'':=^50}\n"print(result)
回页首
__上一篇:__ 列表(list)的7种实现方式
__下一篇:__
我的HOT博:
- Hot:Python之魔幻切片(1207阅读)
- 练习:数列求和a, aa, aaa, ..., aa...aa(n个a)(1206阅读)
- 个人信息提取(1501阅读)
- 十六进制字符串转Python代码(utf-8字符串转十六进制字符串)(1025阅读)
- 生成100个随机正整数(1654阅读)
- 给定字符串提取姓名(字符串、list、re“零宽断言”)(1244阅读)
- 我的 Python.color() (Python 色彩打印控制)(1575阅读)
- python清屏(2416阅读)
- 回车符、换行符和回车换行符(2475阅读)
- Linux 脚本文件第一行的特殊注释符(井号和感叹号组合)的含义(1481阅读)
- random.sample()将在python 3.9x后续版本中被弃用(1346阅读)
- pandas 数据类型之 Series(1507阅读)
- 聊天消息敏感词屏蔽系统(字符串替换 str.replace(str1, *) )(1559阅读)
- 练习:银行复利计算(用 for 循环解一道初中小题)(1494阅读)
- pandas 数据类型之 DataFrame(3503阅读)
- :班里有人和我同生日难吗?(蒙特卡洛随机模拟法)(2298阅读)
- Python 续行符(\)“拯救”你的超长语句(1105阅读)
- Python字符串居中显示(3663阅读)
- 练习:求偶数和、阈值分割和求差( list 对象的两个基础小题)(1715阅读)
- 用 pandas 解一道小题(2083阅读)
- 可迭代对象和四个函数(1128阅读)
- “快乐数”判断(1299阅读)
- 罗马数字转换器(构造元素取模)(2392阅读)
- Hot:罗马数字(转换器|罗生成器)(5256阅读)
- Hot:让QQ群昵称色变的代码(44638阅读)
- Hot:斐波那契数列(递归| for )(4169阅读)
- 柱状图中最大矩形(1698阅读)
- 排序数组元素的重复起止(1299阅读)
- 电话拨号键盘字母组合(1485阅读)
- 密码强度检测器(22227阅读)
- 求列表平衡点(1891阅读)
- Hot: 字符串统计(4362阅读)
- Hot:尼姆游戏(聪明版首发)(3583阅读)
- 尼姆游戏(优化版)(1258阅读)
- 推荐条件点阅破千
回页首
精品文章:
- 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费
两数之和:找出给定数组中和是给定目标整数的两个整数,输出找到的两个整数下标相关推荐
- leetcode(167)两数之和 II - 输入有序数组
两数之和 II - 输入有序数组 给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target . 函数应该以长度为 2 的整数数组的形式返回这两 ...
- leetcode167. 两数之和 II - 输入有序数组
leetcode167. 两数之和 II - 输入有序数组 题目描述 链接: leetcode167. 给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目 ...
- 力扣 167. 两数之和 II - 输入有序数组
167. 两数之和 II - 输入有序数组 给定一个已按照 非递减顺序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target . 函数应该以长度为 2 的整数数 ...
- leetcode 两数相加c++_167. 两数之和 II - 输入有序数组
167. 两数之和 II - 输入有序数组 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1和 index2,其中 index1必须小 ...
- 两数之和 II - 输入有序数组(Java实现)
两数之和 II - 输入有序数组 题目 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小 ...
- c++两个数组对比去掉重复的元素_LeetCode 题解 | 167.两数之和 II 输入有序数组...
点击上方蓝字设为星标 下面开始今天的学习- 力扣 167.两数之和 II - 输入有序数组(点击文末阅读原文查看题目)题目描述 给定一个已按照 升序排列 的有序数组,找到两个数使得它们相加之和等于目标 ...
- C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组
C/C++描述 LeetCode 167. 两数之和 II - 输入有序数组 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在 ...
- 167. 两数之和 II - 输入有序数组
167. 两数之和 II - 输入有序数组 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必 ...
- 算法-----两数之和 II - 输入有序数组
题目 给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target . 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值.numbers ...
最新文章
- hdu 5542(树状数组优化dp)
- html怎么设置闪烁字,HTML最简单的文字闪烁代码
- async和await理解代码
- colorWithPatternImage, stretchableImageWithLeftCapWidth
- 2.Windows 界面技术发展现状
- 深度装机大师一键重装_教你使用深度装机大师重装win10系统
- (转载)软件测试全套教程,软件测试自学线路图
- 通过ADB命令打开MTK和展讯日志的方法
- 在商业化道路上,小冰还要再多走几步
- scrapy重试机制_Scrapy项目之User timeout caused connection failure(异常记录)
- 电脑播放视频显示运行服务器失败,电脑不能播放视频如何解决?
- 标准盒子模型和怪异盒子模型
- Stm32F4以太网远程固件升级BootLoader踩过官方的坑
- Word标准简单格式
- 我与工具--阅读和知识管理
- 音视频开发——H265码流解析
- mysql怎样添加唯一标识_MySql设置唯一标识,主键等设置
- 如何使用phpunit运行单一测试方法?
- 盘点十大国内外热门的SaaS点评平台
- OKR工具有哪些?如何选择适合自己的?
热门文章
- putty下载与安装
- Python:import与from import的理解
- 【论文笔记】《Blockchained On-Device Federated Learning》精读笔记
- 学渣的刷题之旅 leetcode刷题 70.爬楼梯(动态规划)
- 【ABAP】采购申请审批增强Demo
- 病毒木马查杀实战第023篇:MBR病毒之引导区的解析
- 微信对接推送模板消息
- 项目总结(二) 网格化管理系统问题总结
- Illegal unquoted character ((CTRL-CHAR, code 13)): has to be escaped using backs
- 计算机毕业设计房地产客服管理系统xns程序
- leetcode(167)两数之和 II - 输入有序数组
- 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费