问题描述

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]

尝试解法

class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums) - 1):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
return i, j #暴力解决,依次遍历每个元素,找到和为target的数,返回其下标

官方题解

两遍哈希表
为了对运行时间复杂度进行优化,我们需要一种更有效的方法来检查数组中是否存在目标元素。如果存在,我们需要找出它的索引。保持数组中的每个元素与其索引相互对应的最好方法是什么?哈希表。 通过以空间换取速度的方式,我们可以将查找时间从 O(n)O(n) 降低到 O(1)O(1)。哈希表正是为此目的而构建的,它支持以 近似 恒定的时间进行快速查找。我用“近似”来描述,是因为一旦出现冲突,查找用时可能会退化到 O(n)O(n)。但只要你仔细地挑选哈希函数,在哈希表中进行查找的用时应当被摊销为 O(1)O(1)。 一个简单的实现使用了两次迭代。在第一次迭代中,我们将每个元素的值和它的索引添加到表中。然后,在第二次迭代中,我们将检查每个元素所对应的目标元素(target - nums[i]target−nums[i])是否存在于表中。注意,该目标元素不能是 nums[i]nums[i] 本身!

 Java版 

public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement) && map.get(complement) != i) {
return new int[] { i, map.get(complement) };
}
}
throw new IllegalArgumentException("No two sum solution");
}

最新文章

  1. CSS3 Flexbox轻松实现元素的水平居中和垂直居中
  2. Linux 设备驱动程序 字符设备
  3. 使用openssl实现ECDSA签名以及验证功能(附完整测试源码)
  4. 2014 UESTC暑前集训搜索专题解题报告
  5. NYOJ题目1049自增自减
  6. 老项目的#iPhone6与iPhone6Plus适配#iOS8无法开启定位问题和#解决方案#
  7. WinMain初始化详细过程以及消息循环
  8. winmail安装完成后,SMTP/POP3/ADMIN/HTTP/IMAP/LDAP服务不能启动?
  9. $(this).val()与this.value的区别?text()与html()的区别?
  10. poj 1020 Anniversary Cake(切正方形蛋糕+搜索)
  11. PHP中字符串补齐为定长
  12. CENTOS6.6上搭建单实例ORACLE12C
  13. noip单词接龙
  14. Node.js基础学习一之Get请求
  15. JS中every()和some()的用法
  16. [转]Linux/Windows下脚本对拍程序
  17. yii2项目中运行composer 过程中遇到的问题
  18. awk的基本使用方法
  19. framework4.0 IIS配置支持ashx
  20. BZOJ3195: [Jxoi2012]奇怪的道路【状压DP】

热门文章

  1. awk 复习
  2. ie清理缓存
  3. Oracle JDK 1.8 openJDK11 定制化JDK
  4. kettle 通用的数据库迁移流程
  5. delphi 自动获取串口
  6. Get WMS Static GoodLocation By Dynamic SQL
  7. vue 封装组件
  8. 使用Ajax错误的全页面刷新问题
  9. PHP 十万数字不同数组取最大的5个 (经典面试题topK) (原)
  10. 一个比较难忘的BUG