两数之和

在这里插入图片描述

为了提高自己的编程能力,我花了点钱买了力扣的vip,之前我学习的是C语言,后来学习了python,两种类型的编程语言,怎么说呢,学了python给人焕然一新的感觉,python自带了很多内置函数,可能你并不理解它有些函数到底是怎么实现的,但是作为本科阶段的我来说,我得明确目标,我现在要会用,站在巨人的肩膀上看一切,我之前因为python有好多实用的功能可以直接调用而感觉不适,为什么呢?我的习惯是打破砂锅问到底,但是有的时候得换个思路来,如果我想了解这些,可以以后研究生或者更以后去了解,明确自己现在的任务和能力,很多东西不需要自己白手起家重复造轮,所以我现在要将python作为自己首要的编程语言(可能以后要学c++,语言只是工具而已),那么我就从这道题开始自己的修炼之旅~
这道题题意简单,一开始我的实现方法是弄一个嵌套循环,看看两个数之和是否等于target,但是后面的测试时间超了,所以需要换一种方法:

  1. 方法一:
    先看看下面这段代码:
def twoSum(nums, target):
        dic = dict(zip(nums, list(range(len(nums)))))
        for i, key in enumerate(dic):
            if dic.get(target - key) is not None:
                lyst = [dic.get(key), dic.get(target - key)]
                lyst.sort()
                return lyst
            return []

这个方法其实自己在用时候担心使用了is not None,因为这意味着,每一个target - num都需要去字典里找一遍,但是python既然放在这里作为python语言的常用功能,就说明它已经非常优化了(可以尝试一下,python内置的列表排序功能:list.sort()的效率非常高,快速排序跟它简直不可同日而语),事实证明了我的想法,这个方法很不错。其实一开始我不是想着拿一个字典出来,而是列表,我可以将每一个元素判断in list,但是后面呢?in list仅仅出来一个布尔值,我需要的是你在列表中在那个地方输出来,而不是仅仅给一个在或不在,这就需要用到字典了,字典可以直接使用dict[2]来判断是否有一个键为2的键值对,但是这样有个缺点,当2不在字典中的时候程序抛出异常直接结束了,我们当然希望它运行完啊,所以这就使用字典的get()函数,比如判断字典中是否包含键为2 的键值对,直接:dist.get(2),如果存在,它返回2对应的value,不存在返回None,而不是抛出异常强制终止程序。但是,上面那种方法存在问题,比如输入的数据是[3, 2, 4]的时候,我们希望它输出[1, 2],可是结果呢?它输出的是[0, 0],因为它会重复使用字典中的value值。往往这种情况下(需要剔除遍历过的元素,但是又不能将其剔除,以免影响其他循环),看看解决这一矛盾之后的代码:

def twoSum(nums, target):
        dic = {}
        for i, key in enumerate(nums):
            if dic.get(target - key) is not None:
                lyst = [i, dic[target - key]]
                lyst.sort()
                return lyst
            else:
                dic[key] = i
        return []

这段代码巧妙在不是像上面一样一开始就将字典创建好并将数据采集进去,
拿输入的数据为[3, 2, 4], 6来说明:每一次循环看看当前数的“补码”是否在字典里边,如果在,就将两个互为“补码”的所以构成列表返回;如果不在,就将当前的数结合索引存进字典。

力扣的还有一个很棒的功能就是,你的代码通过之后,你可以查看别人的代码:
在这里插入图片描述
在这里插入图片描述

选择区域可以看到别人的源代码,可以学习别人的思路,我看了其他的级别的代码发现大家的思路差不多,基本上都是创建一个空字典,不断往里边填数据,我就拿一些不是这样思路的代码来学习一下:
方法二:

def twoSum(nums, target):
	 # 1、列表转字典,通过zip()函数
        num_dict = dict(zip([i for i in range(len(nums))], nums))
        # 2、字典排序,通过items(),sorted()和lambda
        num_dict_sorted_by_value = dict( sorted(num_dict.items(), key= lambda xzy : xzy[1]) )
        # # 3、裁剪掉大于target的数,字典变为元素为元祖的列表    ----错误, 可能有负数
        # num_shorted = []
        # for elem_tuple in num_dict_sorted_by_value.items():
        #     if elem_tuple[1] <= target:
        #         num_shorted.append(elem_tuple)
        #     else:
        #         break
        # print(num_shorted)
        # 4、循环
        result = []
        for num in list(num_dict_sorted_by_value.items()):
            for otherNum in list(num_dict_sorted_by_value.items())[::-1]:
                if num[0] == otherNum[0]:
                    print("continue")
                    continue
                if num[1] + otherNum[1] < target:
                    print("second break")
                    break
                if num[1] + otherNum[1] == target:
                    print("find it")
                    result.append(num[0])
                    result.append(otherNum[0])
                    return result

这个代码的整体思路很简单,首先将列表nums转化成字典,key是原来列表的index值,然后排序一下,接下来就是一个嵌套循环,但是它这个嵌套循环实际上容易超时。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值