【算法】两数之和

5 篇文章 0 订阅
5 篇文章 1 订阅

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

1 暴力破解

let nums = [2, 7, 11, 15];
let tarhet = 9;
var twoSum = function(nums, target) {
  for(let i = 0; i < nums.length ; i++){
    let temp = target - nums[i];
    for(let j = i + 1 ; j < nums.length ; j++){
      if(temp === nums[j]){
        return [i,j];
      }
    }
  }
};
nums = [3,2,4]
tarhet = 6;
let start = new Date();
let t = twoSum(nums,tarhet);
let end = new Date();
console.log(end - start);
console.log(t);
复杂度分析

1、时间复杂度: O(n²)
2、空间复杂度:O(1)


两遍哈希表


var twoSum2 = function(nums, target) {
  const m = new Map();
  for(let i = 0; i < nums.length ; i++){
    m.set(nums[i],i);
  }

  for(let j = 0 ; j < nums.length ; j++){
    let temp = target - nums[j];
    // console.log(m,m.get(temp));
    if(m.has(temp) && m.get(temp) !== j){
      return [j,m.get(temp)]
    }
  }
};

start = new Date();
t = twoSum2(nums,tarhet);
end = new Date();
console.log(end - start);
console.log(t);

一遍哈希表

这是一种非常巧妙的思路。
1、先计算差值
2、寻找差值
3、保存当前值到Hash中

这样做,巧妙的利用了一个值不能被使用两次:
1、避免了同一个值被两次使用。
2、避免了不必要的遍历

return 的值也是很有意思,因为是减法,要把i放在数组的后一位

var twoSum3 = function(nums, target) {
  const m = new Map();
  for(let i = 0; i < nums.length ; i++){
    let temp = target - nums[i];
    if(m.has(temp)){
      return [m.get(temp),i]
    }
    m.set(nums[i],i);
  }
}

start = new Date();
t = twoSum3(nums,tarhet);
end = new Date();
console.log(end - start);
console.log(t);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值