leetCode题目

一.

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用
e.g.

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

代码实现如下

def twoSum(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """
    for a in range(len(nums)):
        for b in nums:
            if b + nums[a] == target:
                if a != nums.index(b):
                    return a, nums.index(b)
            else:
                continue

分析:首先遍历列表的索引赋值给a和列表的元素赋值给b,紧接找到符合条件的一个元素与另一个元素的索引,然后判断两个元素的索引值是否不同,如果不同则返回两个元素的索引,相同则进行下一次循环 。

仔细想想这个程序进行了两次遍历,时间复杂度为O(n^2),leetcode测试时间显示为令人咋舌的7312ms,显然这不是最优解,当然如果这是你第一次刷题,无可后非这样做是可以的,仔细分析一下就可知道查找一个元素是否在列表中的时间复杂度是O(n),而查找一个键是否在字典中的时间复杂度是O(1),那么我们可不可以尝试着用字典来解决这道题呢?当然可以!

优化:

def twoSum(nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """

    dic = {}
    for i, num in enumerate(nums):
        if target-num in dic:
            return dic[target-num], i
        else:
            dic[num] = i  # 创建字典键值对

此程序的巧妙之处在于将列表转换为字典的形式,以列表的元素作为字典的键值,然后查找字典的键值是否满足条件,由于生成和查找字典的键值对的时间复杂度均为O(1),所以此程序的时间复杂度为O(n)

推荐一本python下学习算法的书籍

返回顶部

返回索引页面

posted @ 2018-04-20 22:16  sumcet  阅读(259)  评论(0编辑  收藏  举报