Published: 10 Jun 2019 › Updated: 10 Jun 2019

LeetCode 1 | Two Sum 两数之和
题目描述
给定一个整数数组 和一个目标值 ,在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
例如:
nums = [2, 7, 11, 15]
target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
分析
最容易想到是暴力解法, 即使用两个循环, 遍历所有可能的情况, 查找两两相加结果是期望值的结果
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
// 暴力解法
// 时间复杂度:O(n的二次方)
// 空间复杂度:O(1)
var twoSum = function(nums, target) {
let l = nums.length
for (let i = 0; i < l;i++) {
for (let j = i + 1; j < l; j++) {
// 如果两数相加等于期望值 返回两数的下标
if (nums[i] + nums[j] === target) {
return [i, j]
}
}
}
};
这种方式好比两个人对暗号, 每两个人都要互相询问一遍,才能配对,时间消耗大。
为了减少时间复杂度, 可以使用登记册(Hash表)的方式,这是一种用更多的空间 ,换取更快的时间的一种常用法,步骤为先循环一遍,让每个人把自己的暗号和对应索引记录在登记册上。所有人登记完毕后, 再次遍历一遍,从记录完成的Hash表中找到每个人需要对应的暗号,如果找到了,就返回自己的索引和Hash表中对上暗号的索引。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
// 两遍Hash表
// 时间复杂度:O(n) (2 * n)
// 空间复杂度:O(n) 所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 n 个元素
var twoSum = function(nums, target) {
let hash = {}
// 把数组中每个元素的值和数组索引, 作为key和value, 记录在hash表中
for (let i=0; i < nums.length; i++) {
hash[nums[i]] = i
}
// 从hash表中取配对结果
for (let i=0; i < nums.length; i++) {
// t为当前数组元素满足相加和为target的元素值
let t = target - nums[i]
// 如果hash表中有配对值 又不是当前元素自己, 则配对成功
if (hash[t] >= 0 && hash[t] !== i) {
return [i, hash[t]]
}
}
};
hash表登记和配对的过程可以同时进行,如果一个人在Hash表中找到了自己的暗号,则配对成功, 返回Hash表中对应暗号的下标和自己的下标,否则就把自己的暗号登记下来,这样一遍下来就可以对上暗号
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
// 一遍 Hash表
// 时间复杂度:O(n)
// 空间复杂度:O(n)
var twoSum = function(nums, target) {
let hash = {}
for (let i=0; i < nums.length; i++) {
let t = target - nums[i]
// hash表中有值 则配对成功返回
if (hash[t] >= 0) {
return [hash[t], i]
}
// 没找到值, 把自己的值和下标登记在hash表
hash[nums[i]] = i
}
};
Leave LeetCode 1 | Two Sum 两数之和 to:
Read more #cn posts
Best Posts From Hughie8
We have not curated any of hughie8's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.
More Posts From Hughie8
- 初次使用SteemPlus, 这款插件挺好用的
- 杭州某互联网公司给程序员发的年中福利,,植发治疗服务,,
- LeetCode 27 | Remove Element 删除数组元素
- LeetCode 5 | Longest Palindromic Substring 最长回文子串
- LeetCode 4 | Median of Two Sorted Arrays 寻找两个有序数组的中位数
- mini 5降价了 购一台
- LeetCode 3 | Longest Substring Without Repeating Characters 无重复字符的最长子串
- 大份吃不起,小份不够吃,,
- LeetCode 2 | Add Two Numbers 两数相加
- LeetCode 1 | Two Sum 两数之和