【LeetCode】两数之和-1
Hz 12/2/2021
# 题目
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
- 示例:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
输入:nums = [3,2,4], target = 6
输出:[1,2]
输入:nums = [3,3], target = 6
输出:[0,1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum/ (opens new window)
# 思考
根据题目提示,比较优的方式是 target - 数组某项
题目相对轻松
# 过程
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
let data = [];
let obj = {};
nums.forEach(function (d, i) {
obj[d] = i;
})
nums.every(function (e, i) {
let cha = target - e;
if (obj[cha] > -1 && i !== obj[cha]) {
data = [i, obj[cha]];
return false
} else {
return true
}
})
return data;
};
草稿 方便阅读,有些细节可以更优化
let arr = [3, 2, 4]; // [2, 7, 11, 15]
let target = 6; // 9
app(arr, target);
function app(arr, target) {
console.time("暴力枚举")
arr.every((e, i) => {
let current = arr[i];
let cha = target - e;
//console.log("cha", cha);
let index = arr.findIndex(d => d === cha);
//console.log("index", index)
if (index > -1) {
if (i === index) {
return true;
}
console.log(i, index);
return false
} else {
return true
}
})
console.timeEnd("暴力枚举")
console.time("Hash(键值对)方式");
let obj = {};
arr.forEach((d, i) => {
obj[d] = i;
})
//console.log("obj", obj)
arr.every((e, i) => {
let cha = target - e;
//console.log("cha", cha)
//console.log("obj[cha]", obj[cha])
if (obj[cha] > -1) {
if (i === obj[cha]) {
return true;
}
console.log(i, obj[cha]);
return false
} else {
return true
}
})
console.timeEnd("Hash(键值对)方式")
}