LeetCode 之 JavaScript 解答第一题 —— 两数之和(Two Sum)

Time:2019/4/1
Title:Two Sum
Difficulty: simple
Author:小鹿

题目一:Two Sum

Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution, and you may not use the same element twice.

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

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1]

Solve:

▉ 法一:暴力破解法

算法思路:用目标值减去数组中的某一个数值,查找差值是否在数组中存在。

/**
 * 步骤:
 * 1)外循环:target 值要一一减去数组中的元素,记录差值
 * 2)内循环:拿着差值去数组中比较判断是否存在
 * 3)如果存在:返回两个元素的下标
 * 4)如果不存在:继续遍历
 *
 * 性能分析:
 * 1)时间复杂度分析:两层 for 循环,所以时间复杂度为 O(n^2)
 * 2)空间复杂度分析:不需要额外的空间,所以空间复杂度为 O(1)
 */
var twoSum = function(nums, target) {
    for(let j = 0;j < nums.length; j++){
        subtract = target - nums[j];
        for(let i = 0;i < nums.length; i++){
            if(nums[i] == subtract && i !== j){
                return [j,i]
            }else{
                continue;
            }
        }
    }
    return false;
};
//测试
const nums = [2,7,11,15];
console.log(twoSum(nums,26));
▉ 法二:两遍哈希表

算法思路:先遍历数组将下标对应的元素存到散列表,然后同目标值减去的值去散列表中查看是否存在。

/**
 * 步骤:
 * 1)遍历数组数据,将根据下标和元素值存放到散列表中。
 * 2)目标值减去数组元素差值并在散列表中查找。
 * 3)如果存在,返回两元素的下标。
 * 4)不存在继续遍历
 *
 * 性能分析:
 * 1)时间复杂度分析:随机访问的时间复杂度为O(1),但是需要遍历所有数据,所以时间复杂度为 O(n)。
 * 2)空间复杂度分析:需要额外的 n 大小的空间存储散列表,空间复杂度为 O(n)。
 */
var twoSum = function(nums, target) {
    var map = new Map();
    for(let i = 0;i < nums.length; i++){
        map.set(nums[i],i)
    }
    for (let j = 0; j < nums.length; j++) {
        substra = target - nums[j];
        if(map.has(substra) && map.get(substra) !== j){
            return [j,map.get(substra)]
        }
    }
}

// 测试
const nums = [2,7,11,15];
console.log(twoSum(nums,9));
▉ 法三:一遍哈希表

算法思路:遍历目标值减去数组元素的差值同时判断该值在散列表中是否存在差值,如果存在,则返回;否则将数据加入到散列表中。

/**
 * 步骤:
 * 1)遍历目标值减去数组元素的差值同时判断该值在散列表中是否存在差值
 * 2)存在该差值,返回该元素下标
 * 3)不存在,将该差值存储到散列表中继续遍历。
 *
 * 性能分析:
 * 1)时间复杂度分析:随机访问的时间复杂度为O(1),但是需要遍历所有数据,所以时间复杂度为 O(n)。
 * 2)空间复杂度分析:需要额外的 n 大小的空间存储散列表,空间复杂度为 O(n)。
 */
var twoSum = function(nums, target) {
    var map = new Map();
    for(let i = 0;i < nums.length; i++){
        substra = target - nums[i];
        if(map.has(substra)){
            return [i,map.get(substra)]
        }
        map.set(nums[i],i)
    }
    return false;
}

// 测试
const nums = [2,7,11,15];
console.log(twoSum(nums,26));
▉ 总结:

1、涉及到查找、判断是否存在,相关的数据结构有散列表、平衡二叉树、二分查找、跳表、二叉查找树。

2、使用数据结构的时候注意适用条件

3、注意对时间复杂度、空间复杂度的优化策略。

LeetCode 其他题目解析,请关注我 Github:https://github.com/luxiangqiang/JS-LeetCode
欢迎关注我个人公众号:一个不甘平凡的码农

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容