Leetcode1 两数之和

> 原题:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

方法一:

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        n = len(nums)                   
        for i in range(n):
            for j in range(i+1,n):
                if nums[i] == target - nums[j]:
                    return x,y
                    break
                else:
                    continue

因为现在了leetcode的测试例子变多了,从19增加到20,所以这种最基本的方法是超时的,不能通过运行。

方法2:

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

对于方法一主要问题在于多个循环花费了很多时间,所以一个for循环,再用target减去取到的值,得到temp值,在nums中查找是否是想要的结果,是的话num.index(temp)找到位置,输出结果。

方法三

以上两种方法都不是最好的的方法

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        n = len(nums)                   
        d = {}
        for i in range(n):
            temp = target - nums[i]
            if nums[i] in d :
                return d[nums[i]],i
            else:
                d[temp] = i

先创建一个空字典,然后依次把target-nums[x]的值存入字典,d[temp] = i,将value为i,key是temp的字典输入到d中,存入一个就跟nums[i+1]去比较, 例如有一个nums = [2,7,11,15],在i = 0时,temp = 9-2=7,d为空,所以条件语句不成立,执行d[7] = 0,即d = {‘7’:0} ,i= i+1 = 1,nums[1] = 7 条件语句成立,所以返回产生字典7的index,也就是7的value=0,而另一个是1,输出结果。说白了,就一句话,将循环产生的差值放入字典中,为什么是字典因为可以取index,输出的时候用。

方法四

由方法三可以看出字典法的简洁,自然就较为容易想到同样是字典法的方法四

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        n = len(nums)
        dic1 = {nums[i]: i for i in range(n)}
        dic2 = {i:target-nums[i] for i in range(n)}

        for i in range(n):
            j = dic1.get(dic2.get(i))
            if (j is not None) and (j!=i):
                return i,j

由于产生了两个字典,将两个for 循环对叠展开了,所以将n平方级的复杂度转化成了2n级别,但是显然比方法三一个字典的方法耗时长一点。

你可能感兴趣的:(算法)