这个LeetCode刷题系列的博客权当是为自己记一下笔记吧。博客系列会从LeetCode的第一题开始刷,同时会从零开始学习【因为我就是零/(ㄒoㄒ)/~~】。同时,如果有写错的地方,希望大佬们在评论区指正。

LeetCode官网

LeetCode第一题

首先需要一点点关于时间和空间复杂度的概念。

时间复杂度

首先先简单地说一下时间复杂度:时间复杂度使用大O字母表示,不包括函数的首项和低阶项,跟n有关。比如说一个程序的运行次数如下:

运行次数 时间复杂度O()
9999 O(1)
3n+9 O(n)
$$3n^2+2n+5$$ $$O(n^2)$$

其中常数项运行的时间复杂度都是O(1)【无论运行次数是多么大】。

空间复杂度

空间复杂度也就是这个算法临时需要的储存单元。如果空间不随n变化【也就是为一个常数】,那么他的空间复杂度就是O(1);

题目如下

给定一个整数数组nums和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素【这个应该是翻译有点问题,意思应该是target为两个不同的数相加,不可能为一样的数】。

示例:

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

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

解题方法一

方法一很简单,拿前面的数跟后面所有的数进行比较,代码如下所示:

  1. class Solution {
  2. public int[] twoSum(int[] nums, int target) {
  3. for(int i =0;i<nums.length-1;i++){
  4. for(int j =i+1;j<nums.length;j++){
  5. if(nums[i]+nums[j] == target){
  6. int[] re = {i,j};
  7. return re;
  8. }
  9. }
  10. }
  11. return null;
  12. }
  13. }

那么在这题中,时间复杂度:第一个for循环n次,第二个for循环n-1次

所以,时间和空间的复杂度很简单的知道:

时间复杂度 空间复杂度
$$O(n^2)$$ O(1)

思考一下,如果我们可以这样做:我们知道一个数,用target去相减,得到一个数后,再去判断这个是否存在,如果存在则返回,这样就可以减少时间复杂度到O(n)了,这时候神奇的HashMap就出现了。(ps:HashMap进行元素的查找时间复杂度是o(1))【这个方法当然,emm不是我想到的/(ㄒoㄒ)/~~】

解题方法二:使用HashMap(一)

  1. class Solution {
  2. public int[] twoSum(int[] nums, int target) {
  3. Map<Integer, Integer> map = new HashMap<>();
  4. for(int i=0;i<nums.length;i++){
  5. // 将数组元素做为key,便于查找
  6. map.put(nums[i],i);
  7. }
  8. for(int j=0;j<nums.length;j++){
  9. // 获得相减数
  10. int com = target - nums[j];
  11. // 假如存在,则比较是否重复
  12. if(map.containsKey(com) && map.get(com) != j){
  13. return new int[]{j,map.get(com)};
  14. }
  15. }
  16. return null;
  17. }
  18. }

时间复杂度是O(n),空间复杂度是O(n),因为是用了HashMap去储存元素。

时间复杂度 空间复杂度
$$O(n)$$ O(n)

本来以为这样很牛逼了,但是现在发现还有更牛逼的操作

在上面的操作中,我们是使用HashMap存储所有数组,但是如果结果就在第一个和第二个呢?那岂不是浪费空间?这时候我们就可以先比较,后放数组。

解题方法二:使用HashMap(二)

  1. class Solution {
  2. public int[] twoSum(int[] nums, int target) {
  3. Map<Integer, Integer> map = new HashMap<>();
  4. for(int i=0;i<nums.length;i++){
  5. int com = target - nums[i];
  6. if(map.containsKey(com)){
  7. return new int[]{map.get(com),i};
  8. }
  9. map.put(nums[i],i);
  10. }
  11. return null;
  12. }
  13. }
时间复杂度 空间复杂度
$$O(n)$$ O(n)

在LeetCode提交后查看了一下时间,后面两种速度大约比第一种快了3倍。

以后我还是老老实实刷题吧。

谨守本心,做到极致 ——《将夜》

LeetCode每天一题之两数之和的更多相关文章

  1. Leetcode第1题:两数之和

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的 两个 整数.你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素.示例:给定 nums ...

  2. LeetCode(1): 两数之和

    本内容为LeetCode第一道题目:两数之和 # -*- coding: utf-8 -*- """ Created on Sun Mar 10 19:57:18 201 ...

  3. Leetcode之二分法专题-167. 两数之和 II - 输入有序数组(Two Sum II - Input array is sorted)

    Leetcode之二分法专题-167. 两数之和 II - 输入有序数组(Two Sum II - Input array is sorted) 给定一个已按照升序排列 的有序数组,找到两个数使得它们 ...

  4. LeetCode刷题 - (01)两数之和

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

  5. 【LeetCode】1. Two Sum 两数之和

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:two sum, 两数之和,题解,leetcode, 力 ...

  6. Leetcode#1.Two Sum(两数之和)

    题目描述 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], ta ...

  7. 【LeetCode刷题】——两数之和.1

    ---恢复内容开始--- 一直想在leetcode上面刷题,但是java刚刚摸了一下门,所以迟迟没有动手,今天做了第一道题,感觉自己实在菜的不行,但是还是学到了很多东西, 就记录一下遇到的问题. 首先 ...

  8. [LeetCode] Sum of Two Integers 两数之和

    Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. Exam ...

  9. 【leetcode】 算法题2 两数相加

      问题      给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例 ...

随机推荐

  1. GitHub上最受欢迎的 5 大 Java 项目

    1. Mockito Mockito 并不是无酒精混合饮料的意思.Mockito 是一个针对 Java 的 mocking 框架.它与 EasyMock 和jMock 很相似,但是通过在执行后校验什么 ...

  2. 软件光栅器实现(四、OBJ文件加载)

    本节介绍软件光栅器的OBJ和MTL文件加载,转载请注明出处. 在管线的应用程序阶段,我们需要设置光栅器所渲染的模型数据.这些模型数据包括模型顶点的坐标.纹理.法线和材质等等,可以由我们手动编写,也可以 ...

  3. How to setup Visual Studio without pain

    Visual Studio (VS) can be very hard to install. If you are lucky, one whole day may be enough to ins ...

  4. python读取文件时提示"UnicodeDecodeError: 'gbk' codec can't decode

    解决办法1. FILE_OBJECT= open('order.log','r', encoding='UTF-8') 解决办法2. FILE_OBJECT= open('order.log','rb ...

  5. 2019/3/7 Java学习之多线程(基础)

    Java学习之多线程 讲到线程,就必须要懂得进程,进程是相当于一个程序的开始到结束,而线程是依赖于进程的,没有进程,就没有线程.线程也分主线程和子线程,当在主线程开启子线程时,主线程结束,而子线程还可 ...

  6. webapi使用swagger出现“Cannot read property 'parameters' of null”

    前端时间在webapi项目使用swagger来提供接口文档及测试工具,按网上方法(http://wmpratt.com/swagger-and-asp-net-web-api-part-1)配置好之后 ...

  7. C#通过COM组件操作IE浏览器(二):使用IHTMLDocument3完成登录

    第一章介绍了如何打开网站,这一章介绍一下使用IHTMLDocument3完成登录博客园,以下为代码: SHDocVw.InternetExplorer oBrowser = new SHDocVw.I ...

  8. Java初学者最佳的学习方法以及会遇到的坑(内含学习资料)!

    最近系统整理了一套java初学者最佳的学习方法以及会遇到的坑等,希望对你有所帮助. 目录: 一.学习java的前提 二.学习java的方法 三.学习java时的坑 四.学习java的路线(画重点) 一 ...

  9. 吴恩达机器学习笔记40-用调和平均数F来进行查准率和查全率之间的权衡(Trading Off Precision and Recall by F sore)

    在很多应用中,我们希望能够保证查准率和查全率的相对平衡. 我们可以将不同阀值情况下,查全率与查准率的关系绘制成图表,曲线的形状根据数据的不同而不同: 我们希望有一个帮助我们选择这个阀值的方法.一种方法 ...

  10. java中的全局变量如何实现?ThreadLocal~

    全局变量就是不管你在哪里,都能够直接引用的变量,还不用担心各种问题.每个语言都有自己的全局变量,我想! 一般地,面向过程的语言当中,可能就是一个声明在最前面的变量,后面的代码直接引用,就成了全局变量! ...