美文网首页
【LeetCode】1. 两数之和

【LeetCode】1. 两数之和

作者: 尹小芃槑 | 来源:发表于2018-12-07 10:33 被阅读0次

    LeetCode 题目地址:https://leetcode-cn.com/problems/two-sum/description/

    题目

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

    你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

    示例:

    给定 nums = [2, 7, 11, 15], target = 9
    
    因为 nums[0] + nums[1] = 2 + 7 = 9
    所以返回 [0, 1]
    

    JavaScript:

    /**
     * @param {number[]} nums
     * @param {number} target
     * @return {number[]}
     */
    var twoSum = function(nums, target) {
    
    };
    

    解答

    方法一

    获取一个元素之后,向后查找是否有与其相对应的数字,如果没有,找下一个元素。如果有,则返回。

    /**
     * @param {number[]} nums
     * @param {number} target
     * @return {number[]}
     */
    var twoSum = function(nums, target) {
        let len = nums.length;
        for(let i = 0; i < len; i++) {
            for (let j = i + 1; j < len; j++) {
                if(nums[i] + nums[j] === target) {
                    return [i,j];
                    break;
                }
            }
        }
        return [];
    }
    

    方法二

    获取一个元素a,我们又知道了两数之和target,所以我们可以通过target - a 的计算,得到我们要找的另外一个数字,这个时候我们在数组中查找就好。

    /**
     * @param {number[]} nums
     * @param {number} target
     * @return {number[]}
     */
    var twoSum = function(nums, target) {
        let n;
        let x;
        let len = nums.length - 1;
        for(let i = 0; i < len; i++) {
            n = target - nums[i]; // 获取满足条件的另一个数字
            x = nums.indexOf(n, i + 1); // 在nums数组中的第 i+1个元素之后,查找是否存在n
            if(x > -1) {
                return [i, x];
            }
        }
        return [];
    };
    

    方法三

    方法二 中的indexOf其实也算是遍历了一遍数组,遍历数组是很浪费时间的,那么我们有没有什么办法可以快速的查找数据呢?

    为了更快速的查找改元素,我们定义一个对象obj,将key定义为数组元素,value定义为该数组元素在数组中定义的下标,例如:

    let nums = [2, 7, 11, 15];
    将 nums 改写成 obj
    let obj = {
        "2" : 0,
        "7" : 1,
        "11" : 2,
        "15" : 3
    }
    

    假设我们要数字11在nums数组中所在的位置,只需obj["11"]即可获取。

    解题代码如下:

    /**
     * @param {number[]} nums
     * @param {number} target
     * @return {number[]}
     */
    var twoSum = function(nums, target) {
        let len = nums.length;
        let n = {};
        for(let i = 0; i < len; i++) {
            if (n[ target - nums[i] ] !== undefined){
                return [n[ target-nums[i] ], i];
            }
            n[ nums[i] ] = i;
        }
        return [];
    };
    

    转载请注明:转自尹小芃槑

    相关文章

      网友评论

          本文标题:【LeetCode】1. 两数之和

          本文链接:https://www.haomeiwen.com/subject/jnnzcqtx.html