leetcode 两数之和

题目介绍

在这里插入图片描述

解决方法

暴力破解

直接使用循环来进行解题

用python实现

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        for i in range(len(nums)):
            for j in range(len(nums)):
                if(nums[i]+nums[j]==target):
                    return [i,j]
        

优化
找出nums[i],创建一个新的数组储存nums前i各元素tump=nums[:i],再在tump中遍历寻找是否存在值为target-nums[i]的元素,如果存在将该元素的坐标赋值给j结束循环
最后返回 [j,i] 注意j在i前面

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        for i in range(len(nums)):
            tump=nums[:i]
            if((target-nums[i])in tump):
                j=tump.index(target-nums[i])
                break
        
        return [j,i]

执行用时344ms

哈希表法

首先介绍:

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

语法:
enumerate(sequence, [start=0])
sequence – 一个序列、迭代器或其他支持迭代对象。
start – 下标起始位置。

举例:

a=[1,2,3,4]
for i,a in enumerate(a):
    print(i,a)#i表示数据下标,a返回列表数据
# 0 1
# 1 2
# 2 3
# 3 4

代码实现:

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        hashmap={}#创建一个空字典
        for i,value in enumerate(nums):#遍历列表,value返回列表数据,i返回数据坐标
            #查找hashmap字典中的key是否有target-value
            if target-value in hashmap:
                #如果存在返回target-value对应的值与 i
                return [hashmap.get(target-value),i]    
            hashmap[value]=i#如果不存在,将 "value":"i" 添加到hashmap字典中

两遍哈希表

哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的。另外,编码比较容易也是它的特点之一。

在第一次迭代,将每个元素和其索引值添加到字典中。然后在第二次迭代中,检查每个元素对应的目标元素的索引值是否存在(hashmap.get(target-value)),但是目标元素的索引值不能是元素自身(hashmap.get(target-value)!=i)

#两次遍历哈希表
def twoSum4(nums,target):
    hashmap={}
    for i,value in enumerate(nums):
        hashmap[value]=i
    for i,value in enumerate(nums):
        if (hashmap.get(target-value))and(hashmap.get(target-value)!=i):
            return [i,hashmap.get(target-value)]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值