今天又是苦逼搬砖的一天
正题
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
方法一:数组枚举,暴力破解法。
原理: 讲述组遍历,依次两两相加,得到 target ,求出 下标
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
for (let index = 0; index < nums.length - 1; index++) {
for (let subIndex = index + 1; subIndex < nums.length; subIndex++) {
let x = nums[index]
let y = nums[subIndex]
if (target === x + y) {
return [index, subIndex]
}
}
}
};
方法二:哈希表法:
枚举法找到 target - x 的时间复杂度较高,因此优化的方法应当从降低时间复杂度来看。使用哈希表,可以将寻找 target - x 的时间复杂度从 O(N) 降低到 O(1),最多只需要将数组遍历一遍即可完成计算。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
const map = {}
for (let index = 0; index < nums.length; index++) {
const values = Object.values(map)
const keys = Object.keys(map)
const number = nums[index]
let i = values.indexOf(number)
if (i !== -1) {
return [parseInt(keys[i]), index]
} else {
map[String(index)] = target - number
}
}
}