leetCode第一题

82 阅读1分钟

也准备开始另寻一份工作了。今天开始准备一下算法。

小目标:每天一题

大目标:每天三题!!!

题目:两数之和

给定一个整数数组 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)