【算法一天一练】两数之和

解题思路

  • 用 hashMap 存一下遍历过的元素和对应的索引。
  • 每访问一个元素,查看一下 hashMap 中是否存在满足要求的目标数字。
用Object实现
const twoSum = (nums, target) => {
  // 存放出现过的数字,和对应的索引
  const prevNums = {};                         
  // 遍历元素
  for (let i = 0; i < nums.length; i++) {      
    // 当前元素
    const curNum = nums[i];                    
    // 满足题目要求的目标元素
    const targetNum = target - curNum;         
    // 在prevNums中找目标元素的索引
    const targetNumIndex = prevNums[targetNum];
    // 如果存在,直接返回 [目标元素的索引, 当前索引]
    if (targetNumIndex !== undefined) {        
      return [targetNumIndex, i];             
    }                                     
    // 如果不存在,说明之前没出现过目标元素
    // 每次都存入当前元素和对应的索引
    prevNums[curNum] = i;                      
  }
}

//作者:xiao_ben_zhu
//链接:https://leetcode-cn.com/problems/two-sum/solution/qing-xi-de-bian-liang-ming-ming-bang-zhu-ji-yi-bu-/
//来源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
用Map实现
const twoSum = (nums, target) => {
  // 1. 构造哈希表
  const map = new Map(); // 存储方式 {need, index}

  // 2. 遍历数组
  for (let i = 0; i < nums.length; i++) {
    // 2.1 如果找到 target - nums[i] 的值
    if (map.has(nums[i])) {
      return [map.get(nums[i]), i];
    } else {
      // 2.2 如果没找到则进行设置
      map.set(target - nums[i], i);
    }
  }
};

//作者:jsliang
//链接:https://leetcode-cn.com/problems/two-sum/solution/javascript-map-by-jsliang/
//来源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

注意,除了抛出异常以外,没有办法中止或跳出 forEach() 循环

var twoSum = function(nums, target) {
     const map =new Map();
	 let result =null;
     nums.forEach((item,index)=>{
         if(map.has(item)){
			 result =[map.get(item),index];
			 // 不能在这里返回,forEach循环没有办法中止
			 // 返回值也不是函数twoSum的返回值
			 // return [map.get(item),index];
         }else{
             map.set(target-item,index)
         }
    })
	return result;
};

这些数组方法则可以对数组元素判断,以便确定是否需要继续遍历: Array.prototype.every 、 Array.prototype.some()、 Array.prototype.find() 、 Array.prototype.findIndex()

var twoSum = function(nums, target) {
  var _result
  nums.some(function (item, index) {
    var _index = nums.indexOf(target - item)
    if (_index !== -1 && index !== _index) {
      _result = [index, _index]
      return true
    }
  })
  return _result
};

作者:keng-ren-de-xiao-shu-tong
链接:https://leetcode-cn.com/problems/two-sum/solution/js-zhong-duan-somexun-huan-by-keng-ren-de-xiao-s-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
indexOf实现

特点

  • 从后往前遍历,这样比从前往后更高效
  • 每一次变量都
var twoSum = function(nums, target) {
    let i = nums.length;
    while(i > 1) {
        let last = nums.pop();
        if (nums.indexOf(target - last) > -1) {
            return [nums.indexOf(target - last), nums.length]
        }
        i--
    }
};

//作者:lin-536
//链接:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-lin-536/
//来源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值