两数之和
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];
};
方案二:双指针法
/**
* @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];
};
方案三:暴力破解法优化版
/**
* @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];
};
方案四:使用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;
}
}
};
总结:
本篇提供了几种对两数之和的解法,其中无论是暴力破解还是双指针效率都不大高的样子,综合下来还是最后一种相对更好些,但相信肯定还有更多更优的解法,期待解密中。。。