【简单】1、两数之和
一、暴力破解,执行效率低,可能会超时
【1】思路:从第0位开始,查看和后面几位的之和是否=target
# -*- coding:utf-8 -*-
# __author__:pansy
# 2022/5/11
# 在数组nums中查找和为target的两个值的下标并输出,假设只会存在一组值
def towSum(nums,target):
# 创建列表
list = []
# 从坐标位置1开始查找,
# 从坐标位置2开始查找:
# 两数字想加,记录
for x in range(len(nums)-1):
for y in range(x+1,len(nums)):
if nums[x] + nums[y] == target:
list.append(x)
list.append(y)
return list
nums = [3,2,4]
target = 6
print(towSum(nums,target))
二、优化1
【1】知识点1:index(目标值,起始位置)查找列表元素并返回索引位置
【2】知识点2:用in查询,in可以用在字符串、列表、集合、元祖、字典中等
【3】知识点3:用count计算数组中的值,统计在字符串/列表/元组中某个字符出现的次数,可以设置起始位置或结束位置。
# -*- coding:utf-8 -*-
# __author__:pansy
# 2022/5/11
# 在数组nums中查找和为target的两个值的下标并输出,假设只会存在一组值
# 优化1:判断target-nums[i]是否在数组中,用index()查找列表元素并返回索引位置(知识点1)
def towSum(nums,target):
lens = len(nums)
j = -1
# 从刚开始位置查询
for i in range(lens):
# 如果target-num[i]在list里面,用in查询,in可以用在字符串、列表、集合、元祖、字典中等(知识点2)
nums2 = target-nums[i]
if nums2 in nums:
# 如果找到的找到的值的次数是1并且num1 = num2,说明找到的是本值,需要继续找
# 用count计算数组中的值,统计在字符串/列表/元组中某个字符出现的次数,可以设置起始位置或结束位置。(知识点3)
if (nums.count(nums2) == 1) & (nums[i] == nums2):
continue
else:
# 输出num2的索引位置,从num1后面一位开始
j = nums.index(nums2,i+1)
break
if j>0:
return [i,j]
else:
return []
nums = [2,7,11,15]
target = 9
print(towSum(nums,target))
三、优化2
【1】不需要每次都从nums中查找,可以将nums切片,每次查找num[i]的前面或者后面数组内的数据即可,可以提升效率
def towSum(nums,target):
lens = len(nums)
for i in range(1,lens):
temp = nums[:i]
num2 = target - nums[i]
if num2 in temp:
j = nums.index(num2)
return [i,j]
四、优化3:哈希查找
# 优化3:通过哈希模拟字典
def twoSum(nums, target):
# 创建哈希字典(知识点1)
hashmap={}
# enumerate,可以获得索引和值,前面是索引,后面表示值(知识点2)
for inx,num in enumerate(nums):
# 将下标和值以键值对的方式存入哈希表中,num是key,inx是value
hashmap[num] = inx
print(hashmap) # 输出{0: 2, 1: 7, 2: 6, 3: 15}
for i,num in enumerate(nums):
# 在哈希表中查找num2的索引位置
j = hashmap.get(target-num)
if j is not None and i!=j:
return [i,j]
nums = [2,7,6,15]
target = 13
print(twoSum(nums,target))