Leetcode 刷题-两数之和

两数之和

题目一:

在这里插入图片描述
解题关键:
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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值