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