LeetCode HOT题目
1.两数之和-列表
题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
<!--示例:-->
<!--给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7
= 9 所以返回 [0, 1]-->
解题思路:
遍历每个元素, 得到每个元素所需的diff, 看这个diff是否存在于这个nums列表中(除自身外) 下面用三种方法,一层层优化这题的解法。。。
方法一: 暴力遍历
(复杂度: O(n^2))
代码
def twoSum(nums, target):
length = len(nums)
#i/j都是位置索引
for i,value in enumerate(nums):
diff = target - value #得到差值(即:在余下的元素中找到diff值即可)
j = i + 1 #因为不能重复利用同个元素,所以把‘位置索引j’加上1
while j < length:
if nums[j] == diff:
return [i,j]
j += 1
方法二: 先排序 + 首尾递进查找
复杂度: O(n*logn+n)
代码
def twoSum(nums, target):
sorted_id_lst = sorted(range(len(nums)), key=lambda x: nums[x]) # 记录排序后的位置索引(不会真的对原nums排序)
left_point = 0 # 记录左边的索引位置
right_point = len(nums) - 1 # 记录右边的索引位置
while left_point < right_point: # 当左边索引位==右边索引位时,退出循环(没有找到target)
sum = nums[sorted_id_lst[left_point]] + nums[sorted_id_lst[right_point]] # sorted_id_lst是索引位的列表, 取值方法略繁琐
if sum == target:
return [sorted_id_lst[left_point], sorted_id_lst[right_point]]
elif sum < target:
left_point += 1
elif sum > target:
right_point -= 1
方法三: 哈希表
复杂度: O(n)
代码
def twoSum(nums, target):
hashmap = {}
for i, value in enumerate(nums):
diff = target - value
if diff in hashmap:
return [hashmap.get(diff), i] # i应该放在后面的位置
hashmap[value] = i # 如果hashmap中没有diff值, 则把value作为键/位置索引作为值赋给hashmap(注意位置别颠倒)