lively-krishnan / brus_question_warehouse

Keep learning
1 stars 1 forks source link

1. 两数之和 #12

Open 18355416639 opened 2 years ago

18355416639 commented 2 years ago

题目描述: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6 输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6 输出:[0,1]

18355416639 commented 2 years ago

解法一:(不通过) 思路:循环遍历数组,然后拿到当前循环项和目标值得差值,使用indexOf再判断数组中是否包含这个差值,若包含会自动返回下标,最后输出符合条件的项。

var twoSum = function(nums, target) {
    for(let i=0; i<=nums.length; i++) {
        let res = target - nums[i]
        if(nums.indexOf(res) >= -1) {
            return [i,nums.indexOf(res)]
        }
    }
};

测试用例 [2,7,11,15,1] 9 通过 当测试用例更改为[11,15,2,7,1] 不通过,原因是遍历的当前元素比target大

修改为:

var twoSum = function(nums, target) {
    for(let i=0; i<=nums.length; i++) {
        if(target >= nums[i]) {
            let res = target - nums[i]
            if(nums.indexOf(res) > -1) {
                return [i,nums.indexOf(Math.abs(res))]
            }
        }
    }
};

当测试用例修改为[3,2,4] 6 时,以上解法不通过

修改为:

var twoSum = function(nums, target) {
    for(let i=0; i<=nums.length; i++) {
        if(target >= nums[i]) {
            let res = target - nums[i]
            if(res !== nums[i] && nums.indexOf(res) > -1) {
                return [i,nums.indexOf(Math.abs(res))]
            }
        }
    }
};

当测试用例修改为[3,3] 6 时,以上解法不通过 更换解决思路

18355416639 commented 2 years ago

解法二:(通过) 扩展知识:https://www.cnblogs.com/yuer20180726/p/11387699.html Map: 1.接收一个二维数组,或者直接new一个空的map

var m = new Map(); // 空Map

m.set('Adam', 67); // 添加新的key-value

m.set('Bob', 59);

m.has('Adam'); // 是否存在key 'Adam': true

m.get('Adam'); // 67

m.delete('Adam'); // 删除key 'Adam'

m.get('Adam'); // undefined

var m = new Map();

m.set('Adam', 67);

m.set('Adam', 88);

m.get('Adam'); // 88

Set: 1、 创建一个Set,需要提供一个数组作为输入,或者直接创建一个空Set

var s1 = new Set(); // 空Set

var s2 = new Set([1, 2, 3]); // 含1, 2, 3

var s = new Set([1, 2, 3, 3, '3']);

s; // Set {1, 2, 3, "3"}

s.add(4);

s; // Set {1, 2, 3, 4}

s.add(4);

s; // 仍然是 Set {1, 2, 3, 4}

var s = new Set([1, 2, 3]);

s; // Set {1, 2, 3}

s.delete(3);

s; // Set {1, 2}

// 去除数组的重复成员
let array = [1,2,1,4,5,3];
[...new Set(array)] // [1, 2, 4, 5, 3]

代码如下:

var twoSum = function(nums, target) {
    let map = new Map()
    for(let i=0; i<nums.length;i++) {
        let res = target -nums[i]
        if(map.has(res)) {
            return [map.get(res), i]
        }
        map.set(nums[i], i)
    }
};

思路: 创建一个map对象,循环数组,计算当前项与目标值的差值,先判断map里是否有这个差值数,若没有,则往map里面赛进去数和下标,直到找到对应符合条件的数,输出

lively-krishnan commented 2 years ago

题解: 创建一个Map,来查找nums 是否出现过 target- num[I] 的数字,出现过则返回 map中查找到的数据,以及当前的下标

var twoSum = function(nums, target) {
   const result = new Map()
   return nums.reduce((pre, next, index) => {
        let mid = target - next

        if(result.has(mid)) {
            pre = [result.get(mid), index] 
        }

        result.set(next, index)
        return pre

    }, [])
}