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