【LeetCode】每日一题 两数之和

97 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

1. 两数之和

DNA序列 由一系列核苷酸组成,缩写为 'A', 'C', 'G' 和 'T'.。

例如,"ACGAATTCCG" 是一个 DNA序列 。 在研究 DNA 时,识别 DNA 中的重复序列非常有用。

给定一个表示 DNA序列 的字符串 s ,返回所有在 DNA 分子中出现不止一次的 长度为 10 的序列(子字符串)。

你可以按任意顺序 返回答案。

「示例1:」
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]
「示例2:」
输入:nums = [3,2,4], target = 6
输出:[1,2]
「示例3:」
输入:nums = [3,3], target = 6
输出:[0,1]
「提示:」
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案

解题思路

知识点:
map对象中存放的是{key,value}键值对
has(key)方法判断map中是否存在key,返回boolen值
get(key)方法返回map中的value值
​
第一种
解题过程:
1.用map来存放{数组元素值,坐标}这样的键值对
2.运用逆向解法,即用target减去数组中的某个元素,然后来判断map中是否有相同的值,若有则存在满足条件的答案,返回两个坐标即可;若没有,则保存{数组中某个元素值,对应的坐标}到map对象中。依次遍历即可判断是否有满足条件的两个元素。
第二种
如果没有什么好的思路,最简单直接的办法就是代入一下,看看自己如何解这个问题。最直观的想法就是拿一个数,看看后面有没有符合要求的目标值。

代码实现

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
 // 第一种
var twoSum = function(nums, target) {
    map = new Map()
    for(let i = 0; i < nums.length; i++) {
        x = target - nums[i]
        if(map.has(x)) {
            return [map.get(x),i]
        }
        map.set(nums[i],i)
    }
};
​
​
//第二种
var twoSum = function(nums, target) {
  const len = nums.length;
​
  for (let i = 0; i < len - 1; i++) {
    for (let j = i + 1; j < len; j++) {
      if (nums[i] + nums[j] === target) {
        return [i, j]
      }
    }
  }
};

如果你对这道题目还有疑问的话,可以在评论区进行留言;