文章目录

  • 一. 题目描述
  • 二. 解法
    • ① 暴力破解
    • ② 静态哈希表
      • 1. 为什么用哈希表来做
      • 2. 特殊情况:两数相同,map映射覆盖
    • ③ 动态哈希表
    • ④ 未解之谜

诶嘿,经典开头题目

一. 题目描述

数组中同一个元素不能使用两遍:

  • 见实例2,实际过程可能出现输出为[0,0]的情况,就是同一元素使用了两遍,要注意判断

二. 解法

① 暴力破解

看到题干,首选暴力。
只需要遍历数组:对于数组中的每一个元素,都和后面的所有元素进行一次匹配即可。

class Solution {public int[] twoSum(int[] nums, int target) {for(int i=0;;i++){for(int j=i+1;j<nums.length;j++){if(nums[i]+nums[j]==target)return new int[]{i,j};}}}
}
  • 时间复杂度为O(n2n^2n2),空间复杂度为O(1)

现在题目解出来了,但是要怎么优化呢?
看到上述的时空复杂度,可以这么想:时间复杂度和空间复杂度不太均衡,可不可以试一下把时间上的负担分一点到空间上呢?

② 静态哈希表

class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();// 先构建哈希表for(int i=0;i<nums.length; ++i)hashtable.put(nums[i],i);// 再遍历数组,结合哈希表进行查找for(int i=0;i<nums.length; ++i){if(hashtable.containsKey(target - nums[i])){// 这边这个判断不能少,否则出现同一元素使用两次的情况if(hashtable.get(target - nums[i])!=i)return new int[]{hashtable.get(target - nums[i]),i};}}return new int[0];}
}
  • 时间复杂度O(n),空间复杂度O(n)
1. 为什么用哈希表来做

暴力法的时间复杂度由来:n(遍历数组元素)* n(查找能和当前数组组合成target的元素)。
而这个查找的O(n),如果是用哈希表来实现则是O(1)
而由于需要构建出哈希表,我们需要付出O(n)的空间复杂度代价。

2. 特殊情况:两数相同,map映射覆盖

描述:使用两个数据值相同,下标不同的元素。而我们在建立映射表时使用的键值是数据值,因此下标大的元素会覆盖之前的元素,变成新的映射,导致有些映射会丢失。

理解:考虑了好久。。。其实这样子不会出问题

  • 首先保留的是下标大的元素的映射
  • 然后,我们在遍历时使用的是数组,而且是先遇到下标小的元素。
    对这个小的元素进行哈希表查找,刚好可以找到下标大的元素。就可以得到正确的结果

③ 动态哈希表

class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();for (int i = 0; i < nums.length; ++i) {if (hashtable.containsKey(target - nums[i])) {return new int[]{hashtable.get(target - nums[i]), i};}hashtable.put(nums[i], i);}return new int[0];}
}
  • 时间复杂度O(n),空间复杂度O(n)
  • 目前了解的最好的方法
  • 在②的基础上,会比较好理解
  • 在②之上的优化
  1. 不需要进行相同元素的判断:当出现与之前值相同,并且可以组成target的值时,就直接满足return条件了。
    比如实例3,先存储<3,0>映射;到nums[1]的时候,不需要覆盖<3,1>映射,而是满足if判断,直接返回[0,1]。
  2. 占用的时间空间会更小:因为是一边建哈希表一边找answer的,所以很大概率在完全建表之前就找到answer。

④ 未解之谜

这一块是无伤大雅,但是想弄明白的地方

  1. 增强型for循环溢出
    = =这个解决了,应该把nums改成nums.length,还是用得不够熟悉。
// 正常for循环,不会出错
for(int i=0;i<nums.length; ++i)hashtable.put(nums[i],i);
// 增强型for循环,会出现越界错误
for(int i : nums)hashtable.put(nums[i],i);
  1. 需要额外写return
// ②③如果只有if的return,编译器会报错:“missing return statement”,但是①却不需要
return new int[0];

【LeetCode笔记】1. 两数之和(JAVA、哈希表)相关推荐

  1. 算法动画图解:两数之和(哈希表)

    更多算法动画图解,长按此链接跳转AppStore 动画 算法动画图解:两数之和(哈希表) 思路 哈希表map用来保存一个数,另一个数在遍历nums的时候和map中的数尝试求和是否为target,如果求 ...

  2. LeetCode 1. 两数之和【哈希表】

    1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案 ...

  3. 【LeetCode1】两数之和_哈希表

    一.题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是 ...

  4. LeetCode-1.两数之和(哈希表)

    题目内容 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/two-sum 给定一个整数数组 nums 和一个整数目标值 target,请你在该数 ...

  5. 01两数之和(哈希表)

    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一 ...

  6. 用js实现两数之和(哈希表)

    题目:         给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值target  的那两个整数,并返回它们的数组下标.你可以假设每种输入只会对应一个答案 ...

  7. 1.两数之和(哈希表)

    [题目] 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是 ...

  8. 力扣1. 两数之和(哈希表,JavaScript)

    var twoSum = function(nums, target) {let map=new Map()for(let x=0;x<nums.length;x++){if(map.has(t ...

  9. LeetCode:1.两数之和

    LeetCode:1.两数之和 第一次写题解,也第一次做leetcode,不妥之处还望海涵 一.暴力 //cpp class Solution {public:vector<int> tw ...

  10. LeetCode题 - 1 两数之和

    LeetCode题 - 1 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案. ...

最新文章

  1. Oracle学习:事务的隔离级别
  2. Visual Studio“15”进一步改善性能和易用性
  3. 传输层:IP 地址解析 路由转发
  4. 网站设计软件linux,ubuntu下的网页设计 网页制作软件工具.pdf
  5. MANIFEST.MF的用途(转载)
  6. Everything常见问题及搜索技巧
  7. 【语音加密】基于matlab GUI语音信号加密解密(带面板)【含Matlab源码 181期】
  8. setuna软件安装_401.5KB的电脑窗口截取软件,是否超实用?你说了算
  9. 基于PyQT5的图书管理系统(含文档,源码,安装部署简单)
  10. linux nginx rtmp 直播,linux下利用nginx搭建rtmp直播服务
  11. 【VUE】微商城(四)----封装轮播图组件,axios安装使用
  12. Ques1,debug模式打不开的原因
  13. 前端Vue 对称加密(AES),后台php解密
  14. 淮阴工学院计算机硕士生导师,硕士生导师概况
  15. 【数字图像处理】Hough变换C语言实现
  16. ios微信H5网页没有声音的解决方法
  17. 考勤系统怎样登录服务器,ZKtime5.0考勤管理系统标准版客户端登录忘记登录密码...
  18. hive实现获取当前季度第一天
  19. BC3.1精简版win7/10下不兼容问题的解决
  20. 易语言调用大漠插件实现多线程后台绑定游戏窗口和打怪

热门文章

  1. mysql的代码需要保存吗_php向Mysql数据库保存数据的代码
  2. c++ mmap写入速度_内存管理(24)mmap和缺页中断
  3. 电路 第五版 第二章 电阻电路的等效变换
  4. java 遗传算法_[原]遗传算法Java实现源代码
  5. mysql删除记录后id不连续_Mysql数据库中使用DELETE语句时,一般删除一条记录后ID会不连续,才能让序号继续按顺序排列?...
  6. 什么是java的元数据_学习大数据,为什么要先学习Java?
  7. tf.train.get_checkpoint_state
  8. Django 应用分库,数据迁移成功,数据库没有生成表
  9. 7套干货,Python常用技术学习知识图谱!!(史上最全,建议收藏)
  10. SpringBoot 自带工具类~断言