【算法】数组:两数之和

62 阅读2分钟

两数之和

leetcode链接:初级算法 - 两数之和

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

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

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

理解:

1、有一个整数数组nums和一个目标值target

2、找出数组元素中两个数的和为target的元素并返回这两个元素的下标

思路:

1、暴力破解法

2、双指针法

3、使用map

方案一:暴力破解法

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

image.png

方案二:双指针法

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    let j = 1;
    let i = 0;
    let maxArea = nums.length - 1;
    while (nums[i] + nums[j] != target){
        if(j == maxArea){
            i++;
            j = i;
        }
        j++;
    }
    return [i,j];
};

image.png

方案三:暴力破解法优化版

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

image.png

方案四:使用map

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

image.png

总结:

本篇提供了几种对两数之和的解法,其中无论是暴力破解还是双指针效率都不大高的样子,综合下来还是最后一种相对更好些,但相信肯定还有更多更优的解法,期待解密中。。。