【LeetCode】1.Two Sum 两数之和(Python)

1. 题目

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

注意题目中返回的是数组下标

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """

2. 解答

最容易想到的是暴力解法,显然可行但没必要。

2.1 错误解答(自己的)

  1. 首先,题目要求返回下标,因此应保存数的对应下标,Python中使用字典进行保存下标这一操作。字典形式为“数:下标”
  2. 其次,想到可以通过对数组排序后,设置首尾指针,若首尾指针和大于target,则尾指针左移;若和小于target,则首指针右移;若和等于target,则找到对应两数,在字典中找到对应下标,返回结果。思路转代码,内心窃喜
class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        if len(nums) < 2:
            return None
        d = {}
        for i in xrange(len(nums)):
            d[nums[i]] = i
        nums.sort()
        left = 0
        right = len(nums) - 1
        two = nums[left] + nums[right]
        while left < right and two != target:
            if two < target:
                left += 1
            else:
                right -= 1
            two = nums[left] + nums[right] 
        return [d[nums[left]], d[nums[right]]]
  1. 运行出错,当nums=[3,3]时,按照上述代码返回是[1,1]。忽略了数组中存在相同元素的情况

2.2 正确解答(别人的)

以下思路为根据别人的正确代码复述思路。至于别人是谁,我也不知道,LeetCode上的

  1. 首先,题目要求返回数组下标,因此应保存数的对应下标,Python中使用字典进行保存下标这一操作。字典形式为“数:下标”(我的这条思路是正确的 窃喜√)
  2. 依次遍历数组,若“target-当前数”在字典中,则找到对应两数,返回当前下标,以及在字典中找到“target-当前数”对应的下标;若“target-当前数”不在字典中,则在字典中保存“当前数:当前数的下标”。
class Solution(object):
   def twoSum(self, nums, target):
       """
       :type nums: List[int]
       :type target: int
       :rtype: List[int]
       """
       d = {}
       for i in xrange(len(nums)):
           other = target - nums[i]
           if other in d:
               left = d[other]
               right = i
               return [left, right]
           d[nums[i]] = i
       return None

2.3 对比

不要想复杂了,其实挺容易的,离正确只差一丢丢,这一丢丢就是菜鸟与大佬的差距8
博文为记录用,欢迎留言交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章