题目描述
给定一个数组和一个指定的数,数组元素均为整数。返回这个数组中两个数加起来等于这个特定的数的下标(不能重复)。
eg:nums = [2, 7, 11, 15] target = 9
因为: nums[0] + nums[1] = 9 所以返回: [0, 1]
- 第一种方法: 暴力法
第一种方法应该都能想到,使用两层循环,逐个相加去判断是否等于给定的值。
时间复杂度:O(n^2) 空间复杂度:O(1)
var twoSum = function (arr, target) {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] + arr[j] === target) {
return [i, j]
}
}
}
}
- 第二种方法:使用键值对的数据结构来进行缓存。
基本思想是使用键值集合的数据结构比如map、object,逐个缓存到数据中,判断余下的值是否存在于这个对象。这种方法减少一层循环,将时间复杂度降为 O(n)。
时间复杂度:O(n)
- 使用 JavaScript 中的内置对象 Object 来实现,使用 Object 中的 in 方法来判断 target - arr[i] 是否命中缓存。
var towSum = function(arr, target) {
const map = {}
for (let i = 0; i <= arr.length; i++) {
var rest = target - arr[i]
if (rest in map) {
return [map[rest], i]
}
map[arr[i]] = i
}
}
- 使用 JavaScript 中的内置对象 Map 来实现, 使用 Map 中的 has 方法来判断 target - arr[i] 是否命中缓存。
var towSum = function(arr, target) {
const map = new Map()
for (let i = 0; i <= arr.length; i++) {
if (map.has(target - arr[i])) {
return [map.get(target - arr[i]), i]
}
map.set(arr[i], i)
}
}
- 使用数组中的 indexOf 方法实现, 我认为在思想上也可以算是这种解法的一种变种。
var towSum = function(arr, target) {
for (let i = 0; i <= arr.length; i++) {
var position = arr.indexOf(target - arr[i])
if (position !== -1 && position !== i) {
return i >= position ? [position, i] : [i, position]
}
}
}