Leetcode -- 两数之和Ⅰ

1. 两数之和

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

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

解题思路:

(1)暴力破解:解题的关键是diff=target-num1,寻找diff是否也在列表中。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        length = len(nums)
        for i,value in enumerate(nums):
            diff = target - value
            j = i+1 
            while j < length:
                if nums[j] == diff:
                    return [i,j]
                j = j+1 


运行时间1000多ms,考虑优化哈

(2)排序 + 首尾指针查找:首先对列表进行排序,记录下列表中各元素排序后所对应的位置,但是不改变原列表。

         例如[3,2,5] 经过sorted函数得到[1,0,2]

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        sort_list = sorted(range(len(nums)),key=lambda x:nums[x])  #对于nums中的元素按升序进行排序
        start = 0
        end = len(nums)-1
        while start < end:
            add_up = nums[sort_list[start]] + nums[sort_list[end]]
            if add_up == target:
                return([sort_list[start],sort_list[end]])
            elif add_up < target:
                start +=  1
            elif add_up > target:
                end -= 1

运行时间36ms,速度还不错

这里要注意的问题是: A. sorted()函数的用法  sorted(iterable, /, *, key=None, reverse=False) 

           B. lambda匿名函数   key=lambda x:nums[x] 表示按nums[x]升序排列。

e.g. [3,2,5,4]  sort_list[1,0,3,2]即sort_list中是按照nums中的元素从小到大排序的下标列表。

(3)利用哈希表求解: 列表中的每一个元素对应的diff都是不同的,则可以利用哈希表(字典)的思想,以diff为键值(key),而键值对应的value为具体下标。这样通过搜索哈希表就可以寻找到目标。

循环遍历原列表中的每个元素,如果该元素在哈希表中,则返回[该元素的下标,该元素在哈希表中对应的value]

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashmap = {}  #记录每一个位置与target的差值
        for i,value in enumerate(nums):
            if value in hashmap:
                return([hashmap.get(value),i])
            hashmap[target - value] = i

运行时间68ms

 

猜你喜欢

转载自www.cnblogs.com/shawn-young/p/12359469.html