SakuraSnow's blog SakuraSnow's blog
首页
  • JavaScript
  • TypeScript
  • Vue
  • React
  • Git
  • Node
  • Linux
  • 技术文档
  • 博客搭建
  • 数据结构
  • leetcode
  • 关于
  • 友链
  • 收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

SakuraSnow

一只前端咸鱼
首页
  • JavaScript
  • TypeScript
  • Vue
  • React
  • Git
  • Node
  • Linux
  • 技术文档
  • 博客搭建
  • 数据结构
  • leetcode
  • 关于
  • 友链
  • 收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据结构

  • Leetcode

    • 001-Two Sum[两数之和]
      • 002-Add Two Numbers[两数相加].md
      • 003-Longest Substring Without Repeating Characters[无重复字符的最长子串]
      • 004-Reverse-integer[整数反转]
      • 008-String to Integer (atoi)[字符串转整数]
      • 009-Palindrome Number[回文数]
    • 算法
    • Leetcode
    SakuraSnow
    2022-03-05

    001-Two Sum[两数之和]

    # 题目

    Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.

    You may assume that each input would have *exactly* one solution, and you may not use the same element twice.

    You can return the answer in any order.

    # example

    Input: nums = [2,7,11,15], target = 9
    Output: [0,1]
    Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].
    
    1
    2
    3
    Input: nums = [3,2,4], target = 6
    Output: [1,2]
    
    1
    2
    Input: nums = [3,3], target = 6
    Output: [0,1]
    
    1
    2

    # 我的思路

    function twoSum(nums: number[], target: number): number[] {
        // 建立映射表<值, Array<下标>>
        // 用数组是因为可能一个值重复出现
        let map: Map<number, Array<number>> = new Map<number, Array<number>>();
        nums.forEach((value, index) => {
            let arr = map.get(value) || [];
            arr.push(index);
            map.set(value, arr);
        });
        // 开始搜索另一个数是否存在
        for (let i = 0; i < nums.length; i++) {
            let indexs : Array<number> | undefined = map.get(target - nums[i]);
            // 找到下标
            if (indexs != null) {
                // 判断是不是自己加自己
                if ((target - nums[i]) === nums[i]) {
                    // 如果是的话 判断是否有多个相同数字
                    // 如果没有就下一轮了
                    if (indexs.length >= 2) {
                        return [indexs[0], indexs[1]];
                    }
                } else {
                    // 不是自己加自己 直接返回即可
                    return [i, indexs[0]]
                }
            }
        }
        return []
    };
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30

    # 最优解

    把两处查找优化成边遍历边查找,还可以保证不会出现下标重复的问题QvQ

    function twoSum(nums: number[], target: number): number[] {
        // 建立映射表<值, Array<下标>>
        // 第二个用数组是因为可能一个值重复出现
        let map: Map<number, number> = new Map<number, number>();
    
        for (let i = 0; i < nums.length; i++) {
            let value: number = nums[i];
            let dif: number = target - value;
            if (map.has(dif)) {
                // dif存在就返回
                return [map.get(dif) as number, i];
            } else {
                // dif不存在就set到map里 并继续迭代
                map.set(value, i);
            }
        }
        return [];
    };
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #算法#Leetcode#数组#Map
    上次更新: 2022/03/09, 15:16:52
    数组
    002-Add Two Numbers[两数相加].md

    ← 数组 002-Add Two Numbers[两数相加].md→

    最近更新
    01
    009-Palindrome Number[回文数]
    03-10
    02
    008-String to Integer (atoi)[字符串转整数]
    03-10
    03
    004-Reverse-integer[整数反转]
    03-09
    更多文章>
    Theme by Vdoing | Copyright © 2019-2022 Evan Xu | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×