Leetcode题库 — 两数之和(python)

题目来源

题目

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解法一

解题思路:暴力解法,遍历nums数组每一个元素x,然后在x元素位置之后的所有元素中查找元素y(y=target-x),最后返回元素x和y的索引值。
代码如下:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for x in range(len(nums)):
            diff = target - nums[x]
            for y in range(len(nums[x+1:])):
                if diff == nums[x+y+1]:
                    return([x,x+y+1])

在这里插入图片描述

解法二

解题思路: 解法一中有两层for循环,计算复杂,执行时间过长。可以将第二层循环去掉,通过if判断语句,看元素y是否在数组中,结果为True则返回元素x和y的索引值。
代码如下:

class Solution:
	def twoSum(self, nums: List[int], target: int) -> List[int]:
		for x_index,x in enumerate(nums):
			y = target - x
			if y in nums:   # 判断元素y是否在nums数组中
				y_index = nums.index(y)     # 结果为True则读取元素y的索引值
				if x_index == y_index:   # 数组中同一个元素不能使用两遍,若元素x和y的索引值相同,则跳过
					continue    
				else:   
					return x_index,y_index       # 否则返回索引值
					break
			else: 
				continue    # 若元素y不在数组中则跳过进入下一次循环

在这里插入图片描述

解法三

解题思路:遍历nums数组元素,在元素x位置之后查找target-x值,首先判断target-x值是否在元素x之后有出现,若为True,则统计出现次数(用于控制循环)并返回索引值结果。
代码如下:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for x_index,x in enumerate(nums):
            diff = target - x
            k = x_index+1
            if nums[k:].count(diff) > 0:    # 判断diff值是否在列表值x之后出现
                for n in range(nums[k:].count(diff)):    # 若判断为true,则统计出现次数,用于控制循环
                    y_index = nums.index(diff,k)
                    return([x_index,y_index])

在这里插入图片描述

解法四

解题思路:将数组转换成字典,首先创建一个空字典,遍历数组中的元素x,如果target-x值在字典中,则返回x和target-x的索引值,否则将元素x作为key,其索引值作为value存入字典中。另外,如果先存入字典再查找target-x值,当x和target-x的值相同时,结果返回同一个索引值。
代码如下:

class Solution:
	def twoSum(self, nums: List[int], target: int) -> List[int]:
		d = {}	# 创建一个空字典
		for x_index,x in enumerate(nums):
			if target - x in d:     # 查找target-x值是否在字典中
				return d[target-x],x_index
			else:
				d[x] = x_index      # 数组元素为字典的key,其索引值为字典的value

在这里插入图片描述

另外

以上四种解法并不完美和最优,在一组数组中可能有多组两数之和等于target值,也可能同一数字出现多次(索引值不同)。

若有不足或更好解法,后续补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值