LeetCode 热题 HOT 100

1. 两数之和

1.1 题目

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

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

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] nums[1] == 9 ,返回 [0, 1] 。
示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

1.2 解答

/** * @param {number[]} nums * @param {number} target * @return {number[]} */var twoSum = function (nums, target) {    for (var i = 0; i < nums.length; i  ) {        for (var j = i   1; j < nums.length; j  ) {            if (nums[i]   nums[j] == target) {                var result = new Array();                result[0] = i;                result[1] = j;                return result;            }        }    }};
  • 时间复杂度:O(N^2),最坏的情况是数组中任意两个数都要匹配一次。

  • 空间复杂度:O(1)

  • 执行用时:72 ms, 在所有 JavaScript 提交中击败了97.20%的用户

    内存消耗:38 MB, 在所有 JavaScript 提交中击败了56.37%的用户

1.3 答案 2

由于暴力搜索的方法是遍历所有的两个数字的组合,然后算其和,这样虽然节省了空间,但是时间复杂度高,一般来说,为了减少时间的复杂度,需要使用空间来换,这里我们想要使用线性的时间复杂度来解决问题,也就是说,只能遍历一个数字,而另外一个数字呢,可以事先将其存储起来,使用一个Map数据结构,来建立数字和坐标之间的映射关系,由于Map是常数级查找效率, 这样在遍历数组的时候, 用target减去遍历到的数字,就是另外一个需要的数字了,直接在Map中查找其是否存在即可,需要注意的是,判断查找的数字不是第一个数字,比如target是4,遍历得到了一个2,那么另外一个2不能是之前的那个2,整个实现步骤为: 先遍历一遍数组,建立Map映射,然后再遍历一遍,开始查找,找到则记录index。

/** * @param {number[]} nums * @param {number} target * @return {number[]} */var twoSum = function (nums, target) {  const map = new Map();  for (let i = 0; i < nums.length; i  ) {    // 遍历到当前元素的时候, 判断map中是否存在目标值    if (map.has(target - nums[i])) {      // 只循环一遍能够保证 索引不重复      return [i, map.get(target - nums[i])]    }    map.set(nums[i], i)  }  return [];};
  • 时间复杂度: O(N), 其中 N 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x。

  • 空间复杂度: O(N), 其中 N 是数组中的元素数量。主要为哈希表的开销。

  • 执行用时:76 ms, 在所有 JavaScript 提交中击败了91.99%的用户

    内存消耗:38 MB, 在所有 JavaScript 提交中击败了55.75%的用户

来源:https://www.icode9.com/content-4-857501.html

(0)

相关推荐

  • 算法面试题四:两数之和,有效的数独,旋转图像

    这里介绍两数之和,有效的数独及旋转图像的个人解决方法 题目一:两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下 ...

  • 七大排序算法总结

    以下所有动图均来源于一像素博客园 以下代码均使用C 编写 完整代码请到这里下载 稳定排序算法:冒泡排序.插入排序.归并排序 时间复杂度不受数据影响:选择排序.归并排序.堆排序 时间复杂度基本小于n2: ...

  • ​LeetCode刷题实战283:移动零

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • 前端程序员学好算法系列(六)队列

    利用队列我们可以解决很多问题,js数组也可以实现队列,队列的思想为先近先出,js可以用 push和 shift() 很容易的实现一个队列 给你一个二叉树,请你返回其按 层序遍历 得到的节点值. (即逐 ...

  • (1条消息) 两数之和,程序员才懂的 TwoSum 和 Abandon !

    (1条消息) 两数之和,程序员才懂的 TwoSum 和 Abandon !

  • 前端程序员学好算法系列(九)递归回溯算法

    回溯算法主要应用于树形问题,我们先从一个简单的算法入手 17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 ...

  • (1条消息) 动态规划就此一篇 全网最详细, 逐步理解, 万字总结

    文章目录 动态规划 - 超详细系列 首先,先大致列下这篇文章会讲到什么 1.相较于暴力解法,动态规划带给我们的是什么?为什么会有重叠子问题以及怎么去避免的? 2.用不同难度的动态规划问题举例说明, 最 ...

  • ​LeetCode刷题实战100:相同的树

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • QQ群热议问题100题含详解

    初高中数学资料库 推送中高考范围内的知识点总结.常用结论.典型题.解题技巧.解题思想.学习方法.励志故事等. 432篇原创内容 公众号

  • ​LeetCode刷题实战260:只出现一次的数字 III

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • ​LeetCode刷题实战258:各位相加

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • ​LeetCode刷题实战257:二叉树的所有路径

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • ​LeetCode刷题实战256:粉刷房子

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • ​LeetCode刷题实战262:行程和用户

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • leetcode刷题笔记-234. 回文链表(java实现)

    题目描述 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 来源:力扣(LeetCo ...

  • ​LeetCode刷题实战255:验证前序遍历序列二叉搜索树

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...