两数之和(Python3实现)

题目:

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

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


思路:

首先想到的当然是「暴力解法」,即循环遍历两次,找到不同元素组合是否与 target 相等,但是立马就被自己否定了。很显然,这个方法时间复杂度为O(n2),在使用 python3 的情况下,不出意外一定超时,笔者又不想用 C++ 和 Java 来实现,因为我觉得那样属于逃避问题。

接下来有一种优化的思路:换个角度思考,两个元素的和等于目标值,就相当于目标值与一个元素的差值存在剩下的元素中。看起来好像ok,那就开始写代码吧:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        i = 0
        length = len(nums)
        result_index = -1
        result = 0
        while i < length - 1:
            result = target - nums[i]
            try:
                result_index = nums[i+1:].index(result)
            except:
                i += 1
            else:
                return [i, nums.index(result, i+1)]
            if result_index >= 0:
                continue

结果也是ok的,不过笔者在这里偷了个懒,直接用python3封装好的函数来代替了哈希表,少写了几行代码,哈哈。
首答


优化:

虽然通过了,但还存在着优化空间。优化的基本原则是:尽量减少遍历的次数,同时在遍历的时候做尽可能多的事情。 因为最影响时间复杂度的因素就是遍历。

笔者想到的是将 nums 进行排序之后,再利用哈希表即 dict 来查找。同时在排序 nums 的同时可以比较元素与 target 的大小关系,比 target 大的元素显然不会是答案,不需要添加至哈希表,这样可以缩小哈希的范围同时节省内存。合适的排序方法也应该可以提高效率。

具体实现待更 …

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