Skip to content

1_两数之和

js
;(function(){
    /**
     * 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。
     * 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
     * 你可以按任意顺序返回答案。
     * @param {number[]} nums
     * @param {number} target
     * @return {number[]}
     */
    
    // interface ArrayKeyAny {
    //     [key: string | number | symbol]: any
    // }
    
    type numberArray = number[][]
    
    // ### 返回所有满足条件的
    var twoSum = function(nums: number[], target: number): numberArray {
        // res是二维数组,保存符合要求的数组下标值
        let res: numberArray = [];
        nums.forEach((x, k) => {
            for (let i = 1; i < nums.length; i++) {
                // i > k:去掉重复相加的两个元素
                (target === x + nums[i] && i > k) ? res.push([k, i]) : null;
            }
        })
        return res
    };
    console.log(twoSum([1, 2, 3, 4, 5, 8, 7], 6))   // [ [ 0, 4 ], [ 1, 3 ] ]
    
    // ### 只返回第一个满足条件的两个元素
    function twoSumOnlyOne(nums: number[], target: number): number[] {
        // 方法一
        // let res: number[] = [];
        // nums.forEach((x, k) => {
        //     for (let i = 1; i < nums.length; i++) {
        //         // i > k:去掉重复相加的两个元素
        //         (target === x + nums[i] && i > k) ? res.push(k, i) : null;
        //     }
        // })
        // return res
    
        // 方法二
        // let res: number[] = [];
        // for (let i = 0; i < nums.length; i++) {
        //     let index = nums.indexOf(target - nums[i]);
        //     if(index !== -1 && i !== index) {
        //         res.push(i, index)
        //         break;
        //     }
        // }
        // return res
    
        // 方法三
        let res: number[] = [];
        const set = new Set();
        for (let i = 0; i < nums.length; i++) {
            // diff:差值
            let diff = target - nums[i]
            if(set.has(diff)){
                res.push(nums.indexOf(diff), i)
                break;
            }
            set.add(nums[i])
        }
        return res
    };
    console.log(twoSumOnlyOne([1, 2, 3, 4, 5, 8, 7], 6))  // [ 1, 3 ]
    console.log(twoSumOnlyOne([3, 2, 4, 2, 2, 3], 6))  // [ 1, 2 ]
})()