Two Sum
题目链接
【英文版】https://leetcode.com/problems/two-sum/
【中文版】https://leetcode-cn.com/problems/two-sum/
题目
给定一个整数数组 \(nums\) 和一个目标值 \(target\),请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
:type nums: List[int]
:type target: int
:rtype: List[int]
示例
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解法
暴力搜索
遍历\(nums\)中的每一个元素\(x\),查找\(nums\)中另一个元素\(j\)使得\(x+j=target\)
★ 时间复杂度:\(O(n^2)\)
对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费
★ 空间复杂度:\(O(1)\)
Brute Force -python-1
```python class Solution(object): def twoSum(self, nums, target): index1=0 index2=0 for i in range(len(nums)): ele1=nums[i] for j in range(i+1,len(nums)): lel2=nums[j] if ele1+lel2==target: index1=i index2=j break return index1,index2 ``` 结果 执行用时 :4172 ms, 在所有 Python 提交中击败了26.93%的用户 内存消耗 :12.7 MB, 在所有 Python 提交中击败了25.36%的用户 代码可精简部分 1. 无需定义变量index1、index2,直接在ele1+lel2==target部分return 2. 无需定义变量ele1、lel2,直接使用nums[i]、nums[j]Brute Force -python-2
```python class Solution(object): def twoSum(self, nums, target): for i in range(len(nums)): for j in range(i+1,len(nums)): if nums[i]+nums[j]==target: return i,j ``` 执行用时 :4996 ms, 在所有 Python 提交中击败了16.95%的用户 内存消耗 :12.4 MB, 在所有 Python 提交中击败了37.72%的用户哈希表1
• 以空间换速度
• 保持数组中的每个元素与其索引相互对应的最好方法:哈希表
哈希表支持以近似恒定的时间进行快速查找。用“近似”来描述,是因为一旦出现冲突,查找用时可能会退化到\(O(n)\)。但只要你仔细地挑选哈希函数,在哈希表中进行查找的用时应当被摊销为\(O(1)\)2
两遍哈希表
在第一次迭代中,我们将每个元素的值和它的索引添加到表中。然后,在第二次迭代中,我们将检查每个元素所对应的目标元素\((target - nums[i])\)是否存在于表中。注意,该目标元素不能是\(nums[i]\)本身!
★ 时间复杂度:\(O(n)\)
我们把包含有\(n\)个元素的列表遍历两次。由于哈希表将查找时间缩短到\(O(1)\),所以时间复杂度为\(O(n)\)。
★ 空间复杂度:\(O(n)\)
所需的额外空间取决于哈希表中存储的元素数量,该表中存储了\(n\)个元素。
Two-pass Hash Table -python
```python class Solution(object): def twoSum(self, nums, target): dict={} for i in range(len(nums)): dict[str(nums[i])]=i for i in range(len(nums)): if str(target-nums[i])in dict and dict[str(target-nums[i])]!=i: return i,dict[str(target-nums[i])] ``` 结果 执行用时 :44 ms, 在所有 Python 提交中击败了92.95%的用户 内存消耗 :14.2 MB, 在所有 Python 提交中击败了5.01%的用户一遍哈希表
在进行迭代并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。如果它存在,那我们已经找到了对应解,并立即将其返回。
3
One-pass Hash Table -python
```python class Solution(object): def twoSum(self, nums, target): dict={} for i in range(len(nums)): if str(target - nums[i]) in dict and dict[str(target - nums[i])] != i: return i,dict[str(target-nums[i])] else: dict[str(nums[i])] = i ``` 结果 执行用时 :84 ms, 在所有 Python 提交中击败了59.23%的用户 内存消耗 :13.9 MB, 在所有 Python 提交中击败了5.01%的用户参考
原文地址:https://www.cnblogs.com/weixia14/p/11372453.html
- [接口测试 - http.client篇] 16 基于http.client之POM实战一下
- 数论部分第一节:素数与素性测试【详解】
- ProtoBuf 序列化工具组件
- C++STL vector简单使用练习1
- 小解Redis 系列
- 小侃 SQL加密和性能
- 接口测试 | 25 requests + pytest测试实例
- 接口测试 | 24 requests + unittest集成你的接口测试
- 接口测试 23 requests基础入门二
- 写让别人能读懂的代码+网页性能管理详解
- CDOJ 1330 柱爷与远古法阵【高斯消元,卡精度】
- Robot Framework | 04 参数化基于Public API的RFS测试
- 接口测试 | 22 requests基础入门
- 分享一个Mvc的多层架构,欢迎大家拍砖斧正
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ES6中模块导入遇到的问题及其解决办法
- 还在手写任务调度代码?试试这款可视化分布式调度框架!
- 3分钟搞定微信小程序类美团用户商家距离计算
- pytest封神之路第五步 参数化进阶
- 深入解读Vue修饰符sync
- 【深度知识】以太坊数据序列化RLP编码/解码原理
- Android 带伸缩动画的布局
- iOS 图像处理技术追踪-Core Image
- Android BottomSheetDialog使用实现底部拖动弹窗
- Android 滑动渐变背景Toolbar、点击置顶ScrollView
- Android 自定义View 画圆(奥运五环)
- Android 触摸屏交互之手势监听
- Android Glide加载网络图片不显示,但用网页打开又正常显示
- Android获取APP的版本号和版本名
- Android 在一个APP里打开另一个APP