目录

一、问题描述

二、解题思想

三、解题

1.判断极端情况

2.代码实现


一、问题描述

这里直接采用的LeetCode上面的问题描述。

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

下面给出示例:

二、解题思想

首先想到的方法,应该是使用两重for循环来依次遍历nums,但是时间复杂度为,这里就不给出两重for循环的代码了。

我又想到一种方法,使用一个容器p来保存传入的容器nums,然后对容器p进行排序,再接着使用双指针分别从头到尾来查找两个数值相加是否等于target。

代码如下:

    vector<int> twoSum(vector<int>& nums, int target) {vector<int> p = nums;sort(p.begin(), p.end());//定义左指针、右指针分别从两端开始往中间移动查找int l = 0, r = p.size() - 1;while (l != r) {if (p[l] + p[r] < target) {l++;}else if (p[l] + p[r] > target) {r--;}else {break;}}//如果这里左右下标相等的话或者累加不等于 target 则直接返回{}//可以防止两个数重复加两遍的情况if (l == r || p[l] + p[r] != target) {return {};}int m = 0, n = 0;for (int i = 0; i < nums.size(); i++) {if (p[l] == nums[i]) {m = i;}}//注意这里从右边往左遍历,是为了防止出现相同的数例如[3,3] target == 6时的情况for (int i = nums.size()-1; i >=0 ; i--) {if (p[r] == nums[i]) {n = i;}}return { m,n };}

下面是提交通过截图:

上面这种解法虽然不错,但是还有更好的解法。

最后介绍使用哈希表来完成的一种解法:

我们这里将两数之和等于target的两数叫 x、y

  1. 首先建立一个包含key 和 value 的哈希表,注意这里因为我们需要返回的是下标,所以将下标作为value,数值作为key。
  2. 然后在哈希表中查找是否有 target - y的差,也就是是否有 x 存在过了,那么将 x 的 key 和value赋值给 keyValue,如果没有的话,keyValue则等于hashTable.end()。
  3. 如果有x存在的话,返回x的value值和当前循环的下标值 i 。

三、解题

1.判断极端情况

使用哈希表没有特殊的极端情况。

2.代码实现

    vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hashTable;for (int i = 0; i < nums.size(); ++i) {//如果找到差值,则返回差值的key 和value 没找到则返回hashTable.end()auto keyValue = hashTable.find(target - nums[i]);//it 不等于 end() , 则说明之前存过当前数值的差值 if (keyValue != hashTable.end()) {//这里keyValue->sencond是之前得差值得下标,i是当前数值得下标return { keyValue->second, i };}//数值为key 下标为value 通过数值来索引valuehashTable[nums[i]] = i;}return {};}

以上就是对于本题,我看资料所编写出来得题解,如果有更好的方法,欢迎大家在下方留言,一起讨论。

1.两数之和-LeetCode相关推荐

  1. 两数之和(LeetCode)

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

  2. 两数之和(LeetCode)——哈希表法(C语言)

    上一篇文章留了个引子--用"哈希表"法来解决这个问题. 今天,我们来解决一下.为什么用哈希表法?很简单因为它--快! 讲解之前我们先来提出几个问题? 1)什么是"哈希表& ...

  3. 用php求两数之和,Leetcode PHP 两数之和

    友情提示:此篇文章大约需要阅读 1分钟43秒,不足之处请多指教,感谢你的阅读. 题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的 ...

  4. 力扣(leetcode)-1. 两数之和

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

  5. LeetCode题库第1题 两数之和

    两数之和 LeetCode题库第1题 两数之和 看到题,我就想到了暴力法: public int[] force(int[] nums,int target) {for (int i = 0; i & ...

  6. 【LeetCode】两数之和、三数之和、四数之和系列

    文章目录 两数之和★ 三数之和★★ 四数之和★★ 四数相加Ⅱ★★ 最接近的三数之和★★ 此篇文章总结下力扣中的两数之和.三数之和.四数之和及一系列求数组中满足达到目标值的元组个数的问题,仔细阅读下面的 ...

  7. java 1099_【LeetCode(Java) - 1099】小于 K 的两数之和

    [LeetCode(Java) - 1099]小于 K 的两数之和 [LeetCode(Java) - 1099]小于 K 的两数之和 文章目录 1.题目描述 2.解题思路 3.解题代码 1.题目描述 ...

  8. Leetcode刷题第1题:两数之和(基于Java语言)

    ** Leetcode刷题第1题:两数之和(基于Java语言) ** 题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标 ...

  9. 【前端来刷LeetCode】两数之和与两数相加

    大部分玩前端的小伙伴,在算法上都相对要薄弱些,毕竟调样式.调兼容就够掉头发的了,哪还有多余的头发再去折腾. 确实在前端中需要使用到算法的地方是比较少,但若要往高级方向发展,算法的基本功就非常重要啦.对 ...

最新文章

  1. LiveData ViewModel 使用详解
  2. mysql 5.7.15 安装_mysql 5.7.15 安装配置方法图文教程
  3. 值得尝试的 3 个 Linux 终端
  4. 操作符offset 和 jmp指令
  5. mysql 单表卡死
  6. 盘点三个JavaScript案例——实现限时秒杀、定时跳转、改变盒子大小
  7. 数据结构与算法:终于可以用三种语言(C,C#,JavaScript)把图的广度优先遍历讲清楚了(推荐收藏)
  8. [ECMAScript] 说说你对Babel的了解?
  9. typescript箭头函数参数_Typescript 入门基础篇(一)
  10. 第五章 ---- 面向对象(二)
  11. Python被誉为神奇的“胶水语言”,到底神奇在哪?
  12. 14. model(2)
  13. 2021-09-10二叉树的层序遍历
  14. Unity3D物理渲染算法研究【PBR】
  15. snipaste和PS工具
  16. 【学习笔记】Arduino uno r3 控制led灯闪烁
  17. 圆锥形怎么画_如何画圆锥体的展开图?
  18. 四大行业晋身今秋求贤大户 游戏人才缺口奇大
  19. 正态总体均值假设检验
  20. WEKA-Instances-从内存中创建数据集

热门文章

  1. 离你最近的疫情小区,终于可以自己查了!
  2. 贯穿 C++ 11 与 C++ 17 的 Lambda 到底是个什么?
  3. 微软“杀”不死的数据库软件
  4. 微软成功尝试:员工周休三天、待遇不变,工作效率却提高40%!
  5. 漫画:什么是希尔排序?
  6. 华为最强自研 NPU 问世,麒麟 810 测评远超骁龙系列!
  7. 不想打造物联网的制造型企业不是一家合格的百年老店
  8. 百度贴吧 2017 前贴子无法访问;网易腾讯游戏获批;苹果反垄断案败诉 | 极客头条...
  9. 揭秘苹果“地下黑工厂”:临时工薪资无保障,男厕所门口排长龙
  10. 这段 JavaScript 代码能挖出你所有的访问记录!