题目描述:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
image.png

写法一:暴力双层循环模式

  1. function twoSum(nums: number[], target: number): number[] {
  2. let len:number = nums.length
  3. for(let i = 0; i <len;i++){
  4. for(let j = i+1; j < len; j++){
  5. if(nums[i] + nums[j] === target){
  6. return [ i, j]
  7. }
  8. }
  9. }
  10. };

思路讲解:

双循环法:
通过双层循环,定义两个索引变量i和就j,当前取得两个值nums[i]和nums[j]去相加,如果等于目标值target,返回[i,j]

写法二:借助哈希解法(map)

  1. function twoSum(nums: number[], target: number): number[] {
  2. let map:Map<number,number> = new Map()
  3. for(let i = 0;i< nums.length ;i++){
  4. let num:number = nums[i]
  5. let demandValue:number = target -num
  6. if(map.has(num)){
  7. return [i,map.get(num)]
  8. }else{
  9. map.set(demandValue,i)
  10. }
  11. }
  12. };

思路讲解:

哈希法:
借助map数据结构来帮助我们做存储,先循环我们的数组,获取到我们当前的值为num[i],它对应需要的demandValue值就等于我们用目标值target 减去当前值num[i],然后判断我的map里是否有当前这个值,如果没有就把他需要的值demandValue当做key,他的索引当做value放入到我们的map中,继续下一个循环,当我们找到当前值在我们的map里后,以为我们当时是把某个值需要的对应值赋值到map里的,此时如果map有了这个值,就证明这个值跟我们之前的某个值加起来等于我们的目标值,而当时我们在map里存储了那个值的索引,所以我们此时只需返回当前索引和当时存入这个值时的索引就完成了解题。

  1. 示例:
  2. nums = [2,7,11,13] target = 13
  3. map = {}
  4. 循环:
  5. 第一次: 当前值 2 需要值 11 当前索引 0 此时map存入 {11:0} 11为所需值 0位当前索引
  6. 第二次: 当前值 7 需要值 4 当前索引 1 此时map变为 {11:0,7:1} 同上
  7. 第三次: 当前值 11 需要值 2 当前索引 2 此时11 map 所以我们找到了第一次时2对应的值,所以此时只需返回当前索引和当时存的索引 及返回[2,0]