程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

LeetCode-两数之和

发布于2021-05-30 07:54     阅读(1451)     评论(0)     点赞(14)     收藏(4)


题目:

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

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

示例:

给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]

初解题:

  1. 数组中数字不可以重复使用
  2. 返回一个数组
  1. /**
  2. * @param {number[]} nums
  3. * @param {number} target
  4. * @return {number[]}
  5. */
  6. var twoSum = function(nums, target) {
  7. let result = []
  8. nums.map((first,i) => {
  9. let secondIndex = i + 1
  10. let second = nums[secondIndex]
  11. let sum = first + second
  12. if(sum === target) {
  13. result.push(i,secondIndex)
  14. }
  15. })
  16. return result
  17. };

结论:通过了示例测试,但未未考虑到当数组为 [3,2,3],target = 6的情况

思考后修改如下:

  1. /**
  2. * @param {number[]} nums
  3. * @param {number} target
  4. * @return {number[]}
  5. */
  6. var twoSum = function(nums, target) {
  7. let result = []
  8. nums.map((first,i) => {
  9. let secondIndex = i + 1
  10. nums.forEach((second,j) => {
  11. let sum = first + second
  12. if(j >= secondIndex && sum === target) {
  13. result.push(i,j)
  14. }
  15. });
  16. })
  17. return result
  18. };


高手解法:

高手:@tboys

解题思路

哈希表

  1. 遍历的同时,记录一些信息,省去一层循环,[以空间换时间]
  2. 需要记录已经遍历过的数值和它对应的下标,借助查表实现

实现思路

遍历到数字 a 时,用 targettarget 减去 a,就会得到 b,若 b 存在于哈希表中,我们就可以直接返回结果了。若 b 不存在,那么我们需要将 aa 存入哈希表,好让后续遍历的数字使用。

大佬有动画图解,一看就懂。@demigodliu

知识点:

哈希表也被称为散列表,Hash表是一种特殊的数据结构,它同数组、栈、链表等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找。

哈希表是基于键值对的一种数据存储结构,key值不可以重复,value可以重复,后面添加的重复的key值的时候,会把之前key值对应的value给覆盖掉,JavaScript中的对象具有天然的哈希特性。

Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。

相比较Object而言,Map的性能在频繁增删键值对的场景下表现更好

  1. /**
  2. * @param {number[]} nums
  3. * @param {number} target
  4. * @return {number[]}
  5. */
  6. var twoSum = function(nums, target) {
  7. let len = nums.length;
  8. // 创建 MAP
  9. const MAP = new Map();
  10. /**
  11. *Map.prototype.set(key, value)
  12. *设置Map对象中键的值。返回该Map对象。
  13. */
  14. // 由于第一个元素在它之前一定没有元素与之匹配,所以先存入哈希表
  15. MAP.set(nums[0], 0);
  16. for (let i = 1; i < len; i++) {
  17. // 提取共用
  18. let other = target - nums[i];
  19. // 判断是否符合条件,返回对应的下标
  20. if (MAP.get(other) !== undefined) return [MAP.get(other), i];
  21. // 不符合的存入hash
  22. MAP.set(nums[i], i)
  23. }
  24. };

JavaScript中的对象具有天然的哈希特性

来源:@xiao_ben_zhu

  1. const twoSum = (nums, target) => {
  2. const prevNums = {}; // 存储出现过的数字,和对应的索引
  3. for (let i = 0; i < nums.length; i++) { // 遍历元素
  4. const curNum = nums[i]; // 当前元素
  5. const targetNum = target - curNum; // 满足要求的目标元素
  6. const targetNumIndex = prevNums[targetNum]; // 在prevNums中获取目标元素的索引
  7. if (targetNumIndex !== undefined) { // 如果存在,直接返回 [目标元素的索引,当前索引]
  8. return [targetNumIndex, i];
  9. } else { // 如果不存在,说明之前没出现过目标元素
  10. prevNums[curNum] = i; // 存入当前的元素和对应的索引
  11. }
  12. }
  13. }

 

 




所属网站分类: 技术文章 > 博客

作者:听说你很拽

链接:http://www.qianduanheidong.com/blog/article/115876/1eac1b57e007f2ae2699/

来源:前端黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

14 0
收藏该文
已收藏

评论内容:(最多支持255个字符)