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]

总结 主要思路是先排序,然后使用 双指针 大法 即从两头开始循环,直到循环到中间结束,找到满足条件的数据