LeetCode刷题--简单篇

1. 两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍

示例:

​ 给定 nums = [2, 7, 11, 15], target = 9

​ 因为 nums[0] + nums[1] = 2 + 7 = 9
​ 所以返回 [0, 1]

最容易想到的方法,两层循环,但是效率很低

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):  # 注意j是从i+1开始的,目的是不跟i相同
                if nums[i] + nums[j] == target:
                    return [i, j]


nums = [3, 3]
target = 6
a = Solution()  # 定义的类要初始化(或赋值),否则会出错
print(a.twoSum(nums, target))
结果:
[0, 1]

参考了别人的解法:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        # 生成一个字典,记录 值:下标 对应关系
        dic = {}
        for index, num in enumerate(nums):
            dic[num] = index
        # 和为target,该数在字典中为键,看是否存在
        # 不存在则返回了None  
        # 存在就返回了该数在字典中的值,也就是下标,再判断下标是否与前一个数相同
        for i, num in enumerate(nums):
            j = dic.get(target-num)  
            if j is not None and i != j:
                return [i, j]


测试:
nums = [3, 2, 4]
target = 6
a = Solution()  # 定义的类要初始化(或赋值),否则会出错
print(a.twoSum(nums, target))
结果:
[1, 2]

后来自己想优化下,发现是错的,暂时没想到怎么解决下面的问题,错误方法如下:

for i in nums:
    j = target - i
    if j in nums and nums.index(i) != nums.index(j):
        return [nums.index(i), nums.index(j)]
        
nums = [3, 3]
target = 6
a = Solution()
print(a.twoSum(nums, target))

最后结果取不到
posted @ 2020-07-14 17:17  养了只猪  阅读(147)  评论(0编辑  收藏  举报