1. Two Sum

Posted initial-h

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1. Two Sum相关的知识,希望对你有一定的参考价值。

1. Two Sum

Description

Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example: Given nums = [2, 7, 11, 15], target = 9,Because nums[0] + nums[1] = 2 + 7 = 9,return [0, 1].

问题描述

虑一个整数列表,返回两个数字的索引,使得这两个整数之和等于给定的目标值。假定每个输入有唯一解,且每个元素不能重复使用。
举例:给定列表 nums = [2,7,11,15], 目标 target = 9, 返回 [0,1].

问题分析

  • 最容易想到也最粗暴的解法,就是对每一个值,都遍历一遍列表,遇到另一个求和为目标值的数,就输出这两个数的索引,这样的话,时间复杂度为(O(n^2)),空间复杂度为(O(1))。要降低时间复杂度,就要想到利用空间复杂度。这里声明一个字典用来建立两个整数和目标值之间的关系。
  • 字典的键用来存储当前数字需要的那个数字,键值用来存储当前数字的索引。这样,在遍历列表的过程中,对每个遇到的数字,判断该数字是否在字典里。如果在,就找到了这个数字,可以输出其索引,同时字典的键值表示另一个数字的索引,即找到了答案。如果不在,则存储键、键值对,键为目标值减去当前值,键值为当前值的索引。此时,时间复杂度为(O(n)),空间复杂度为(O(n)).
    以举例具体来说:
nums = [2,7,11,15]
target = 9
- 开始
- 定义空字典 hash_dict = {}
-- 遍历列表nums
-- 遍历到第一个数2,检查是否在hash_dict中;发现不在
-- 则,存储target-2(目标值与当前值的差),0(当前值的索引)到字典中;此时hash_dict = {7:0}
-- 遍历到第二个数7,检查是否在hash_dict中;发现在
-- 则,输出[hash_dict[7],1],即[0,1]
- 结束
  • 这种方式的关键在于应用字典,将每次遍历的整数所需要的另一个数记录下来,同时也记录下当前整数的索引,在之后的遍历中,一旦找到这个整数,即可得到需要的两个索引,省去了两层循环的嵌套搜索。

    代码

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        hash_dict = {}
        for i in range(len(nums)):
            if nums[i] in hash_dict:
                return [hash_dict[nums[i]],i]
            else:
                hash_dict[target - nums[i]] = i

测试结果

  • Runtime:36 ms
  • beats 100% of python3 submissions
    技术分享图片




以上是关于1. Two Sum的主要内容,如果未能解决你的问题,请参考以下文章

1_Two Sum --LeetCode

Two Sum

每日一算法之two sum

LeetCode之371. Sum of Two Integers

Two Sum

1. Two Sum