Python学习-Leetcode刷题记1:两数之和
问题:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:给定 nums = [2, 7, 11, 15], target = 9;因为 nums[0] + nums[1] = 2 + 7 = 9;所以返回 [0, 1]。
解题思路
- 看到这个题目,我首先的想法就是需要遍历列表
nums
,且需要遍历两次。第一次遍历是确定第一个数;第二次遍历是寻找出第二个数,通过判断确定第一个数加第二个数等于target
。 - 于是就天真的使用了两次循环来去解题,果然,因为没有考虑到元素重复的问题,程序在某些特殊情况下报错了。(具体错误讲解请看下面的解题过程讲解)
- 经过一番演绎和思考后,确定需要使用到
enumerate
方法,是有这样才能完美的记录元素和元素的索引值,并将元素重复的问题考虑进去。
解题过程讲解
1. 错误的解题方法:
class Solution(object):
def twoSum(self, nums, target):
for i in nums:
n=0
while n<(len(nums)-1):
if i+nums[n]==target:
i=nums.index(i)
nums[n]=nums.index(nums[n])
return [i,nums[n]]
n+=1
s=Solution()
s.twoSum([-1,2,7,22,0,15], 1)
以上解法,如果列表中没有出现重复的元素,程序是没有问题的,但一旦有重复的元素时,将会有以下问题:
如上图,当有重复元素时,给出索引值结果均为第一个元素的索引值,与题目的要求不相符合;
2.正确且优雅的解题方法:
class Solution:
def twoSum(self, nums, target):
another_nums = {}
for index,num in enumerate(nums):
another_num = target -num
if another_num in another_nums:
return [another_nums[another_num],index]
another_nums[num]=index
return none
s=Solution()
s.twoSum([2,7,11,15],9)
解法讲解:
- 创建一个字典,用于存储遍历每一个元素时的索引值和值;
- 通过算出当前值与
target
值的差,判断该差是否已存在字典中,如果存在,那么这一对值就已经被我们找到了,他们分别是num
和another_num
,我们可以通过返回他们在列表中的索引值来的得到结果;如果不存在,我们则需要将已经遍历了的值存到字典中去再继续往下进行遍历。
以上为LeetCode算法题两数之和我的个人解题思路及解题过程,借此记录分享,有不对的地方希望各位大佬指出,大家一起交流学习!