美文网首页
算法简记- 两数和

算法简记- 两数和

作者: 白小纯kl | 来源:发表于2021-09-28 20:13 被阅读0次

1、// . 两数之和

var twoSum = function(nums, target) {
    if (!nums.length) {
        return;
    }
    let hasMap = {};
    let stack = [];
    for (let i = 0, len = nums.length; i < len; i++) {
        let cur = nums[i];
        let tarNum = target - cur;
        if (hasMap[tarNum] !== undefined && i != hasMap[tarNum]) {
            stack.push(hasMap[tarNum], i);
        } else {
            hasMap[cur] = i;
        }
    }
    return stack;
};

2、// 三数和

var threeSum = function(nums) {
    let res = [];
    if (!nums || nums.length < 3) {
        return res;
    }
    let n = nums.length;
    // 排序
    nums.sort((a, b) => a-b);
    for (let i = 0; i < n; i++) {
        if (nums[i] > 0) { // 直接结束
            break;
        }
        if (i > 0 && nums[i] === nums[i-1]){
            continue;
        }
        let left = i + 1;
        let right = n - 1;
        while (left < right) {
            let sum = nums[i] + nums[left] + nums[right];
            if (sum > 0) {
                right--; // 减小
            } else if (sum < 0) {
                left++; // 增加
            } else {
                res.push([nums[i], nums[left], nums[right]]);
                while (left < right && nums[left] === nums[left + 1]) left++;
                while (left < right && nums[right] === nums[right - 1]) right--;
                left++;
                right--;
            }
        }
    }
    return res;
};



var threeSum = function(nums) {
    // 最左侧值为定值,右侧所有值进行两边推进计算
    let res = [];
    nums.sort((a, b) => a - b);
    let size = nums.length;
    if (nums[0] <= 0 && nums[size - 1] >= 0) {
      // 保证有正数负数
      let i = 0;
      while (i < size - 2) {
        if (nums[i] > 0) break; // 最左侧大于0,无解
        let first = i + 1;
        let last = size - 1;
        while (first < last) {
          if (nums[i] * nums[last] > 0) break; // 三数同符号,无解
          let sum = nums[i] + nums[first] + nums[last];
          if (sum === 0) {
            res.push([nums[i], nums[first], nums[last]]);
          }
          if (sum <= 0) {
            // 负数过小,first右移
            while (nums[first] === nums[++first]) {} // 重复值跳过
          } else {
            while (nums[last] === nums[--last]) {} // 重复值跳过
          }
        }
        while (nums[i] === nums[++i]) {}
      }
    }
  
    return res;
  };

3、// 多数和的模板

var twoSum = function(nums, target) {
    let nums1 = [].concat(nums); // 保留之前顺序,确保拿到正确的索引
    nums.sort((a, b) => a - b);
    let lo = 0, hi = nums.length - 1;
    let result = [];
    while (lo < hi) {
        let left = nums[lo];
        let right = nums[hi];
        let res = nums[lo] + nums[hi];
        if (res < target) {
            while (lo < hi && nums[lo] === left) lo++;
        } else if (res > target) {
            while (lo < hi && nums[hi] === right) hi--;
        } else {
            result.push(nums1.indexOf(nums[lo]));
            result.push(nums1.lastIndexOf(nums[hi])); // 从后取索引,防止拿到相同的索引
            while (lo < hi && nums[lo] === left) lo++;
            while (lo < hi && nums[hi] === right) hi--;
        }
    }
    return result;
};

相关文章

  • 算法简记- 两数和

    1、// . 两数之和 2、// 三数和 3、// 多数和的模板

  • 算法:两数之和

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重...

  • 算法-两数之和

    这是一道LeetCode上的问题,详见两数之和,难度标注是简单,但是我思考到了一些比较复杂的情况,之后我会修改题目...

  • 算法--两数之和

    问题描述: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 你可以假设每个输入只对应一种答案,且同样...

  • 算法「两数之和」

    题目:给出数组nums和目标值target,找出和为目标值的两个数在数组中 想法:定义数组和目标值,遍历数组x使得...

  • 算法-两数之和

    算法对于程序的重要性不言而喻,所以从今天开始要一点一滴地积累自己的算法知识,同时也要充分地利用使用的程序语言所提供...

  • 算法:两数之和

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组...

  • 算法----两数之和

    给定一个数组,一个目标值,请在数组中找到和为目标值的两个数字,并返回他们的数组下标。 你可以假设每种输入只会对应一...

  • 两数求和算法

    题目 假设有一个整数数组 nums ,写一个方法 twoSum() ,返回数组中两个元素之和等于入参的下标数组。 ...

  • 算法——两数之和

    找出数组中两数之和等于目标数的下标 1、建一个桶,桶里key是没有找到差值的元素,value是它的index;2、...

网友评论

      本文标题:算法简记- 两数和

      本文链接:https://www.haomeiwen.com/subject/qhbrnltx.html