两数之和
题目一:

解题关键:
num2 = target - num1。 要找的num2也在list中,首先对num2是否存在进行判断:if ( target - num1) in nums;如果结果是True,可进行下一步判断:num2是否和num1相等,若相等,二者是否是同一个数:(nums.count(target - nums[i]) == 1)&(target - nums[i] == nums[i]),若结果是False,则可以开始寻找num2位置。
解法一
def twoSum(nums, target):
lens = len(nums)
j=-1
for i in range(lens):
if (target - nums[i]) in nums:
if (nums.count(target - nums[i]) == 1)&(target - nums[i] == nums[i]):
##count():寻找数组中某个元素的个数,这里将其=1,说明若只有一个,且值相等,说明加的是自己。
continue
else:
j = nums.index(target - nums[i],i+1) #index(x,i+1)是从num1(i+1)后的序列后找num2
break
if j>0:
return [i,j]
else:
return []
print (twoSum([4,6,8,10],16))
输出结果:[1,3] (从0开始)
解法二:
通过字典模拟哈希求解。
def twoSum(nums, target):
hashmap={}
for ind,num in enumerate(nums): # enumerate() 枚举list中的值
hashmap[num] = ind #{4:0,6:1,8:2,10:3}
for i,num in enumerate(nums): #遍历寻找j,get()提取j位置
j = hashmap.get(target - num)
if j is not None and i!=j:
return [i,j]
print(twoSum([4,6,8,10],16))
题目二

解法一:双指针法
思路:在数组头(i=0)和尾(j=n-1)分别设置一个指针,头尾两数相加,若等于target,则输出两数位置;若<target,则把左指针右移(数组按升序排序);若>target,则把右指针左移;若都不符合,return False。因为输出位置要求从1开始,而数组从0开始,所以返回时+1。
def twoSum( numbers, target) :
n = len(numbers)
i = 0
j = n - 1
while i < j:
if numbers[i] + numbers[j] == target:
return [i + 1, j + 1]
elif numbers[i] + numbers[j] > target:
j -= 1
else:
i += 1
return False
print(twoSum([1,3,5,7],8))
输出结果:[1,4]
解法二:暴力法
思路:第一个for循环是从第一个数开始遍历,第二个for循环是从当前数的下个数开始遍历
def twoSum( numbers, target) :
n = len(numbers)
for i in range(len(numbers)): #range(a,b)从a开始到b,(b-a+1)个数,没写a则从0开始
for j in range(i + 1, len(numbers)):
if (numbers[i] + numbers[j] == target):
return [i+1, j+1]
return False
print(twoSum([1,3,5,7],8))
输出结果:[1,4]
解法三:哈希表
思路:将数组中所有元素存入哈希表(字典)dict,遍历数组,判断tmp是否在数组中,如果在且不等于num1,则满足条件。
def twoSum( numbers, target) :
dict = {}
for i in range(len(numbers)):
dict[numbers[i]] = i
for j in range(len(numbers)):
tmp = target - numbers[j]
if (tmp in dict and dict[tmp] != j):
return [j+1, dict[tmp]+1]
return False
print(twoSum([1,3,5,7],8))
212

被折叠的 条评论
为什么被折叠?



