twoSum | leetcode学习之路

    xiaoxiao2023-10-18  201

    1)题目链接:https://leetcode.com/problems/two-sum/ 2)题目翻译:传入一个nums列表,一个整型target,在nums中寻找两个数加起来等于target,并返回这两个数的index。 3)知识点学习 定义一个Solution类,类中定义一个twoSum函数。 nums:List[int] 是python3中的新特性, 直接加冒号注释传入参数的类型。 ->代表返回值的类型

    4)编程

    class Solution(object): def twoSum(self,nums,target): result = [] for i in range(len(nums)): for j in range(i+1,len(nums)): if (nums[i] + nums[j] == target): result.append(i) result.append(j) return result a = Solution() print (a.twoSum([2,3,6],9))

    5)问题总结 在此过程中遇到了是否应该往twoSum中传入self的问题:

    TypeError: unbound method a() must be called with A instance as first argument (got nothing instead)

    错误原因:函数a()非静态方法,故需实例化然后才能使用:

    class Solution: def hello(self): print("It's a soluton") obj = Solution() obj.hello()

    或者将a()改为静态方法即可,如下:

    class Solution: @staticmethod def hello(): print ("It's a solution") Solution.hello()

    6)优化 改变思维 将列表里的数作为key 将index作为value 这样可以保证列表里重复的数只存一次 且寻找这个数不需要遍历这个列表 利用字典key-value 的 hashtable性质 将时间复杂度优化到O(n)

    class Solution(object): def twoSum(self,nums,target): size = 0 d1 = {} d2 = {} while size < len(nums): if not nums[size] in d1: d1[nums[size]] = size else: d2[nums[size]] = size if (target - nums[size] in d1) and target - nums[size] != nums[size]: result = [d1[target - nums[size]],d1[nums[size]]] return result elif target - nums[size] in d2: result = [d2[target - nums[size]],d1[nums[size]]] return result size = size + 1 a = Solution() print (a.twoSum([2,9,6,3,9,2],9))

    还可以先判断有无答案,再放入dictonary,但是速度大大下降

    class Solution(object): def twoSum(self,nums,target): size = 0 d = {} while size < len(nums): if (target - nums[size] in nums) \ and (nums.index(target - nums[size]) != size): #遍历列表使得时间复杂度变成了O(n2) d[nums[size]] = size result = [d[nums[size]],nums.index(target - nums[size])] return result size = size + 1

    最新回复(0)