一起来刷leetcode(1)——两数之和

把寻常的人生过好

才是最不寻常的事

前言

一个胆小紧张的证人正在接受律师的询问。
律师厉声问道:"你是否结过婚?”
“是的,我结过一次。”
证人声音很小,还有些颤抖。
“那么你和谁结婚了?”
“一个女人。”
律师有些发怒
“废话,你当然是和一个女人结婚了。你听说过有谁会和一个男人结婚吗?”
证人颤抖着说:“听说过,我姐姐就和一个男人结婚了。”

一个人是不完整的,两个人才没有缺憾
凭什么!你都是一个人来的,怎么就不可以一个人走呢
一个人看得的寂寞,两个人看得是烟火
我才懒得管你们,反正最后不管是一个人还是两个人,你们都会后悔的 ╥﹏╥\

1 思路分析

输入:nums = [2,7,11,15], target = 9
输出:[0,1]

1.1 基本步骤

  1. 遍历数组nums,得到 num和i
  2. 寻找 9-num 的位置j
  3. 返回 [j, i]

1.2 重点步骤

寻找 9-num 的位置j

2.1. 建立哈希映射,key为num, value为i
2.2. 查找哈希表,获取value

2 代码片段

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
  // 使用map数据结构
  // 可直接使用has,get,set
  const m = new Map()
  // 1.遍历nums
  for (let i = 0; i < nums.length; i++) {
    const num = nums[i]
    // 2.寻找target - num的位置
    if (m.has(target - num)) {
      const j = m.get(target - num)
      // 3.返回
      return [j, i]
    } else {
      // 2.1建立哈希映射
      // 同时避免同一元素相加 [3, 2, 4] 6
      m.set(num, i)
    }
  }
}
复制代码

3 技巧总结

1.Map

// o = {}
m = new Map()

// o.a = b
m.set('a', b)

// o.a
m.get('a')

// a in o
m.has('a')

// delete o.a
m.delete('a')

// Object.keys(o).length
m.size
复制代码

2.双层for循环解构

// for * for
for (let i=0; i<nums.length; i++) {
  for (let j=0; j<nums.length; j++) {
    if (nums[i] + nums[j] === target) {
      return [i, j]
    }
  }
}

// for + for
// 哈希映射
for (let j=0; j<nums.length; j++) {
  m.set(nums[j], j)
}
// 循环
for (let i=0; i<nums.length; i++) {
  if (m.has(target - nums[i])) {
    return [i, m.get(target - nums[i])]
  }
}

// for
for (let i=0; i<nums.length; i++) {
  // 一边循环
  if (m.has(target - nums[i])) {
    return [m.get(target - nums[i]), i]
  } else {
    // 一边建立哈希映射,同时去重
    m.set(nums[i], i)
  }
}
复制代码


谁会和一个男人结婚

自然不是男人咯 o(╯□╰)o

参考链接

往期回顾

  • 期待下期 (*❦ω❦)

猜你喜欢

转载自juejin.im/post/7036721071516549156