leetCode之Two Sum python实现

1. Two Sum

  • 要求:
    Given an array of integers, return indices of the two numbers such that they add up to a specific target。
    You may assume that each input would have exactly one solution, and you may not use the same element twice.
  • 题目大意:给定一个整数数组,返回其中两个数相加等于目标值的那两个数的索引。你可以假设只有唯一的两个数相加等于目标值。不允许你使用同一个数两次。

1.1 暴力法

  • 解题思路:直接定义两个指针,从头开始穷举搜索。
  • 时间复杂度为O(n2)。
  • 这种结果在leetCode是通不过的,会产生“Time Limit Exceeded”。
  • 程序如下
def twoSum(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """
    '''
       Time Limit Exceeded 
    '''
    index = []
    for i in range(len(nums)):
        for j in range(i+1,len(nums)):
            if nums[i] + nums[j] == target:
                index.append(i)
                index.append(j)
                return index

1.2 排序后首尾同时遍历(不专业,暂且就这么叫吧。。。)

  • 解题思路:首先对数组进行升幂排序,然后定义两个指针left和right,分别从左和从右开始遍历。因为排序后,数组是从小到大排列的,所以如果nums[left] + num[right] > target,那么right左移,反之left右移。当找到两个数时,再确定这两个数在原数组中的位置即可。
  • 时间复杂度:O(n+n+n+n)=O(n)。
  • 运行结果:耗时66ms
def twoSum(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """
    temp_num = nums[:]  # [:]表示深拷贝,a = b 表示浅拷贝
    temp_num.sort()  # sort会改变原来数组,所以上面要深复制
    i = 0
    j = len(temp_num) - 1
    index = []
    while i < j:
        if temp_num[i] + temp_num[j] == target:
            for n in range(0,len(nums)):
                if temp_num[i] == nums[n]:
                    index.append(n)
                    break
            for m in range(len(nums)-1,-1,-1):
                if temp_num[j] == nums[m]:
                    index.append(m)
                    break
            index.sort()
            break
        elif temp_num[i] + temp_num[j] > target:
            j -= 1
        elif temp_num[i] + temp_num[j] < target:
            i += 1
    return index

1.3 哈希法

  • 解题思路:第2种方法写的太麻烦了,可以使用使用python中dict,也就是hashmap。
  • 时间复杂度:O(n)
  • 运行结果:耗时53ms
def twoSum(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """
    dict = {}
    index = 0
    for i in range(len(nums)):
        if target - nums[i] in dict:
            return [dict[target - nums[i]],i]
        else:
            dict[nums[i]] = index
            index += 1

你可能感兴趣的:(leetcode刷题)