TIP
题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标
示例: 给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
题解 一:
var twoSum = function (nums, target) {
let ag = [];
let num;
for (let i = 0; i < nums.length; i++) {
num = [...nums];
num.splice(i, 1) // 把自己先去掉
if (num.indexOf(target - nums[i]) != -1) {
ag.push(i, nums.indexOf(target - nums[i]))
}
}
return [...new Set(ag)]
};
题解 二:推荐
var twoSum = function (nums, target) {
const diffs = {}
// 缓存数组长度
const len = nums.length
// 遍历数组
for (let i = 0; i < len; i++) {
// 判断当前值对应的 target 差值是否存在(是否已遍历过)
if (diffs[target - nums[i]] !== undefined) {
// 若有对应差值,那么答案get!
return [diffs[target - nums[i]], i]
}
// 若没有对应差值,则记录当前值
diffs[nums[i]] = i
}
};
思路: 把想加问题转化为减法问题
TIP
题目:三数求和
示例: 给定数组 nums = [-1, 0, 1, 2, -1, -4],target = 0
满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
function merge(num, tag) {
// 首先对mums和mums2 进行排序
const nums = num.sort((a, b) => {
return a - b
})
let res = []; //存放结果数组
let sum = tag; // 目标值
const len = nums.length; // 缓存数组长度
for (let i = 0; i < len - 2; i++) {
// 左指针
let j = i + 1;
// 右指针
let k = len - 1;
// 遇到重复的跳过
if (i > 0 && nums[i] === nums[i - 1]) continue
while (j < k) {
// 三数之和小于0 ,左指针前进
if (nums[i] + nums[j] + nums[k] < sum) {
j++;
} else if (nums[i] + nums[j] + nums[k] > sum) {
k--
} else {
// 目标值
res.push([nums[i], nums[j], nums[k]]);
j++;
k--
}
}
}
return res
}
console.log(merge([-1, 0, 1, 2, -1, -4], 0)); // [-1, -1, 2] [-1, 0, 1]
总结 主要思路是先排序,然后使用 双指针 大法 即从两头开始循环,直到循环到中间结束,找到满足条件的数据