这里是狗蛋的算法江湖,这里的一切都需要用一个叫做算力的东西兑换,而兑换的方式则是做出相应的算法题,这是一个刷题者的故事也是狗蛋儿的算法江湖。蛋儿的算法江湖系列文章关注右侧公众号,回复 狗蛋儿 查看更新哦~

狗蛋儿的算法江湖第一篇 狗蛋儿偷鸡

唉~,真是世风日下,人心不古啊…

暮色降临,帽儿山十里外的一个羊肠小道上,传来了一声悠长的叹息…

顺着羊肠小道走来的是一个生的白白胖胖的,十二三岁模样的少年,

想我程狗蛋,一生算法无双,受人尊敬,今天不就是没有使用算力兑换,偷了寡妇翠花一只鸡么,就把我赶了粗来,这说明什么,这说么,,我偷鸡的手段还不够高明啊…

事情是这样的…

呔,那狗蛋!!竟然偷我鸡,快拿出算力来解除这道题,不然我就把你赶出富贵儿村。

看题!!

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

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

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

程狗蛋儿:啊啊啊!!我不会,迪杰斯特拉老爷爷快救我,救我!!

狗蛋儿,你又惹祸了?罢了,,罢了。

方法一:暴力法
暴力法很简单。遍历每个元素 xx,并查找是否存在一个值与 target - xtarget−x 相等的目标元素。

public int[] twoSum(int[] nums, int target) {for (int i = 0; i < nums.length; i++) {for (int j = i + 1; j < nums.length; j++) {if (nums[j] == target - nums[i]) {return new int[] { i, j };}}}throw new IllegalArgumentException("No two sum solution");
}

复杂度分析:

时间复杂度:O(n^2)O(n 2 ), 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n)O(n) 的时间。因此时间复杂度为 O(n^2)O(n 2 )。

空间复杂度:O(1)O(1)。

方法二:两遍哈希表
为了对运行时间复杂度进行优化,我们需要一种更有效的方法来检查数组中是否存在目标元素。如果存在,我们需要找出它的索引。保持数组中的每个元素与其索引相互对应的最好方法是什么?哈希表。

通过以空间换取速度的方式,我们可以将查找时间从 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] 本身!

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");
}

复杂度分析:

时间复杂度:O(n)O(n), 我们把包含有 nn 个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1)O(1) ,所以时间复杂度为 O(n)O(n)。

空间复杂度:O(n)O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 nn 个元素。

方法三:一遍哈希表
事实证明,我们可以一次完成。在进行迭代并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。如果它存在,那我们已经找到了对应解,并立即将其返回。

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

复杂度分析:

时间复杂度:O(n)O(n), 我们只遍历了包含有 nn 个元素的列表一次。在表中进行的每次查找只花费 O(1)O(1) 的时间。

空间复杂度:O(n)O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表最多需要存储 nn 个元素。

寡妇翠花,你不不是凭自己的实力搞定的,这次先饶过你,以后不许回富贵儿村了。

程狗蛋背着小手,哼着小曲儿,继续走在羊肠小道上,还好我狗蛋儿有实力,每次做算法题都是靠着自己的实力赢得了尊敬的,

想到这里,狗蛋儿擦了擦嘴角的油,感到越发的得意,,我狗蛋儿能吃到鸡,完全靠自己的天资无双啊…,

走着走着,夜色渐渐的降临了,帽儿山上的夜晚静凄凄的,突然一声尖叫打破了帽儿山的宁静…

欲知后事如何右侧关注回复 狗蛋儿,或者坐等明天更新~

两数之和c++实现 java实现 two sum相关推荐

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

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

  2. 两数之和(Python + Java)

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

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

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

  4. leetCode:twoSum 两数之和 【JAVA实现】

    LeetCode 两数之和 给定一个整数数组,返回两个数字的索引,使它们相加到特定目标. 您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素. 更多文章查看个人博客 个人博客地址:t ...

  5. swift golang java,解决两数之和 (Javascript, Java, C#, Swift, Kotlin, Python,C++, Golang)

    解决两数之和(Javascript, Java, C#, Swift, Kotlin, Python,C++, Golang) 给定一个整数数组,返回两个数字的索引,以便它们加起来成为一个特定的目标. ...

  6. LeetCode题库整理【Java】—— 1两数之和

    LeetCode题库整理[Java] 1.两数之和 题目:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数.你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nu ...

  7. java 两数之差_1_两数之和(java)

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

  8. 利用两数之和实现两个数交换(java版本)

    简单说明 import java.util.Scanner; public class HelloWorld {public static void main(String[] args) {int ...

  9. java实现“两数之和”

    java代码如下: import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util. ...

  10. LeetCode第一题:两数之和(Java)

    文章目录 前言 一.题目内容 二.解题过程 1. 解题思路 2. 解题代码 三.提交结果 总结 前言 坚持下去便可胜利.只要心还在,梦想还在,我们还可以坚持直至胜利.没有过不去的坎,只有害怕的心.莫害 ...

最新文章

  1. 算法(第四版)C# 习题题解——1.3
  2. Keypress - 捕获键盘输入的JavaScript库
  3. Python错误“ImportError: No module named MySQLdb”解决方法
  4. ubuntu 压缩率最高的软件_不用写采集规则也可以轻松采集网站文章,揭秘一款明泽文章采集软件的工作原理...
  5. 恐龙拼图游戏 - 恐龙拼图乐园积木游戏
  6. Java 基础知识 练习
  7. volatile与synchronized 同步原理基础讲解
  8. python定时下载链接_python定时下载FTP指定文件
  9. 《图解CSS3:核心技术与案例实战》
  10. java synchronized boolean_java中synchronized关键字
  11. 关于Zuul的几个问题
  12. python 麦克风人声检测_物超所值的人声麦克风推荐
  13. c语言实现freqspace函数,滤波器程序
  14. 使用电脑群控制手机时,电脑硬件配置如何配?
  15. 国内外优秀的设计素材网站推荐
  16. robots.txt文件信息泄漏
  17. ThreadPoolExecutor中的submit()方法详细讲解
  18. pl/sqp常用方法
  19. 【钉钉-场景化能力包】e签宝提供的电子签名能力
  20. MP9486开关电源芯片

热门文章

  1. vs2008简体中文正式版序列号和下载地址
  2. 移动开发利器-Bmob后端云使用体验
  3. android 5.1一键root工具箱,s大师一键root下载
  4. Si523超低功耗带自动寻卡13.56MHz非接触式读写器 替代MFRC523
  5. m4s格式转换mp3_音乐怎么转换mp3格式
  6. 在window中nginx安装腾讯云ssl报错nginx: [emerg] cannot load certificate
  7. 面向对象-当谈论面向对象的时候,我们到底在谈论什么?
  8. Python的index函数用法
  9. html5语文答题制作,语文万能答题模板
  10. 气象大数据平台(天擎)数据读取方法(python)(地面资料下载)