引言:今天开始为找工作做准备,所以开始刷LeetCode上的题。本着输出的学习方式要强于输入的学习方式的思想,我打算用写博客的方式来记录我写每一道题的思路和想法。题目的序号就按LeetCode官网上的序号为准,因为刚开始我只会挑简单的做(留下了学渣的泪水),所以以后题号都会是跳着写的,读者要注意。另外,因为正在学习Python3,所以代码我都是用Python3写的。下面就开始吧。
1,.两数之和
难度:简单
题目描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
大致意思都可以看懂,唯一需要琢磨的可能是这句话:不能重复利用这个数组中同样的元素。 它的意思是不能用相同下标的元素计算得到target,这句话是很重要的判定条件。比如给一个数组nums=[1, 2, 3],target=4,你只能返回[1, 2],不能返回[1, 1]。
这道题官方给了3种解法。
两层循环,第一层遍历整个nums,第二层从第一层遍历到的位置开始往后遍历。直白地说就是按顺序挨个找,以示例中的nums来说就是依次找:(2,7)、(2,11)、(2,15)、(7,11)、(7,15)…当然这里target是9,找到(2, 7)就结束了。
def twoSum(self, nums, target):
#O(n*n)
for index1,num1 in enumerate(nums):
for index2,num2 in enumerate(nums[:(-len(nums)+index1)]):
if(num1 + num2 == target):
return[index1,index2]
两个循环(注意是两个不是两层)。这里定义了一个dict类型的变量,类似于Java的hashmap类型。首先第一个遍历将nums的value作为key,将nums的index作为value赋值到hashmap中。类似:{2:0, 7:1, 11:1, 15:2},就是将nums的下标和索引倒过来存储。为什么不能用其他的数据类型而要用dict(hashmap)呢?答案在第二个遍历里。接下来是重点,这道题的实质是什么?题目描述的是让我们寻找在nums数组中是否存在两个数num1和num2, 使得num1 + num2 = target。如果就照着题目描述正面来想,要解决问题就比较困难。但如果反面来想,我们已知tartget,遍历时我们也知道当前的num,那我们不就可以用target - num得到另一个数应该是几了吗?然后再寻找数组里有没有这个值不就行了?然后就是为什么要使用dict类型存储的理由了,因为在第一遍遍历中我们将nums的索引和值倒过来存储,所以用dict可以直接用if num2 in nums来查找num2这个key是否在dict里(java的map可以用containsKey()方法)。如果确实包含,就可以返回当前的nums索引值index和hashmap的value(hashmap的value即为nums数组的索引)。当然还要判断不能返回相同的元素下标。
def twoSum(self, nums, target):
#O(2*n)
hashmap = {}
for index, num in enumerate(nums):
hashmap[num] = index
for index, num in enumerate(nums):
num2 = target - num
if (num2) in nums:
if(index != hashmap[num2]):#判断下标不能相同
return [index, hashmap[num2]]
def twoSum(self, nums, target):
#O(n)
hashmap = {}
for index, num in enumerate(nums):
num2 = target-num
if num2 in hashmap:
return [index, hashmap[num2]]
hashmap[num] = index
return None
'''
#错误答案
def twoSum(self, nums, target):
#O(n)
hashmap = {}
for index, num in enumerate(nums):
num2 = target-num
hashmap[num] = index
if num2 in hashmap:
if(index != hashmap[num2]):#有没有这句都不对
return [index, hashmap[num2]]
return None
'''