【简单】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))

 

posted on 2022-05-12 22:12  墙角一枝花  阅读(32)  评论(0编辑  收藏  举报