首页 > 编程语言 > 详细

【leetcode算法-简单】1、两数之和

时间:2019-11-24 22:15:23      阅读:85      评论:0      收藏:0      [点我收藏+]

题目描述

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum

解答

  • 解法一:暴力法

  从 i = 0 开始,依次遍历nums[i]后面的元素,判断相加是否为target

  如果找到结果,返回 [i,j] ,若 没有结果返回 []

def twoSum(nums, target):
    for i in range(len(nums)-1):
        for j in range(i+1,len(nums)):
            if nums[i] + nums[j] == target:
                return [i,j]
    return []

  执行用时:4848ms

 

  • 解法二:list切片

  这是解法一的优化版,查找num1之前或之后的元素,看是否存在num2,这里选择向前遍历

  若是选择查找num1之后的元素,则可能在后面的元素存在多个num2,不方便index函数返回索引

def twoSum(nums, target):
    for i in range(1,len(nums)):
        temp = nums[:i]
        num2 = target - nums[i]
        if num2 in temp:
return [temp.index(num2),i]

  执行用时:792ms

 

  •  解法三:字典-哈希算法

  用字典记录num1和num2的值&位置,省去了再查找索引的步骤

def twoSum(self, nums: List[int], target: int) -> List[int]:
    hashmap = {} #定义一个空字典
    for i,element in enumerate(nums):
        hashmap[element] = i   #key:value格式为 nums[i]:i
    for j,element in enumerate(nums):
        num2 = hashmap.get(target-element)
        if num2 is not None and num2 != j: #是否有一个 key 为num2 且 num2的序号不等于当前的序号j
            return [j,num2]

  执行用时:60ms

 

【总结】

  1. dict经常用于python中的高速查找
  2. 查找和插入的速度极快,不会因为key的增加而变慢
  3. 但是dict需要占用大量内存,内存浪费多

所以 dict是用空间换取时间的一种方法

 

 

 

【leetcode算法-简单】1、两数之和

原文:https://www.cnblogs.com/xxx1206/p/11923911.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!