也准备开始另寻一份工作了。今天开始准备一下算法。
小目标:每天一题
大目标:每天三题!!!
题目:两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
// 解法一:暴力处理法(不推荐) 两次for循环
// 时间复杂度:n(n+1+1+1)t (当n趋于无穷大) => O(n^2)
// 空间复杂度:O(1)
// var twoSum = function (nums, target) {
// for (let i = 0; i < nums.length; i++) { // nt
// for (let j = i + 1; j < nums.length; j++) { // n*n*t
// if (nums[i] + nums[j] === target) { // t
// return [i, j]; // t // O(1)
// }
// }
// }
// };
// const res = twoSum([-9, 9, 1, 0], 9)
// console.log(res);
// 解法二:哈希值表法
// 1. 算出当前数字和目标数字的差值
// 2. 检查哈希表中是否存在,存在则返回结果。
// 3. 不存在,当前数值作为key值,索引作为value值
// 时间复杂度:O(n)
// 空间复杂度:O(n)
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
let map = new Map(); // t
for (let i = 0; i < nums.length; i++) { // nt
if (map.has(target - nums[i])) { // t
return [map.get(target - nums[i]), i] // t
} else {
map.set(nums[i], i) // (n-x)t
}
}
};
twoSum([1, 2, 3, 4, 5], 6)