LeetCode 1 Two Sum

一、题目链接

https://leetcode.com/problems/two-sum/

二、解答

2.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)):
                if nums[i] + nums[j] == target:
                    return [i, j]

采用的思想就是直接遍历,没啥好说的。

时间复杂度:$O(N^2)$ 空间复杂度:$O(1)$

2.2 解法二,两次遍历

利用 Python 中的字典这一数据结构。其中,key 存的是 nums[i],value 存的是 i,这里的 i 是给定数组的索引值。

代码如下

class Solution2:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dic = {}
        for i in range(0, len(nums)):
            dic[nums[i]] = i
        for i in range(0, len(nums)):
            complement = target - nums[i]
            if complement in dic.keys() and dic[complement] != i:
                return [i, dic[complement]]

这个解法采用了两次遍历的方法

  • 第一次遍历时,如果 nums 列表中有重复的元素,那么最后 dic[nums[i]] 存储的值将是最后一次的 i;
  • 第二个遍历中,if 语句要考虑两种情况
    • 一是最后的两个 two nums 的值是不同的,那么,很显然,dic[target - nums[i]] 就是与当前的 i 对应的另一个索引值;
    • 二是最后的两个 two nums 的值是重复的,而且,根据题目给定的条件,题目一定有解,且是唯一解,那么,当前的 i 一定是索引值较小的那一个,dic[target - nums[i]] 则是另一个。

时间复杂度:$O(N)$ 空间复杂度:$O(N)$

2.3 解法三,一次遍历

思想和解法二基本是一样的。

class Solution3:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dic = {}
        for i in range(0, len(nums)):
            complement = target - nums[i]
            if complement in dic.keys():
                return [dic[complement], i]
            dic[nums[i]] = i

我们只需要理解一点,找到相应的解时,分两种情况

  • 一,最后的两个 two nums 的值是不同的,那么,i 的值是大于 dic[target - nums[i]] 的;
  • 二,最后的两个 two nums 的值是重复的,那么,i 的值还是大于 dic[target - nums[i]] 的,和第一种情况没什么不同,之所以分两种情况,是为了捋得更清楚一些。

时间复杂度:$O(N)$ 空间复杂度:$O(N)$

三、完整代码

# -*- coding: utf-8 -*-
# @File  : leet_01.py
# @Author: FanLu
# @Date  : 2021/7/9

from typing import List

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)):
                if nums[i] + nums[j] == target:
                    return [i, j]

class Solution2:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dic = {}
        for i in range(0, len(nums)):
            dic[nums[i]] = i
        for i in range(0, len(nums)):
            complement = target - nums[i]
            if complement in dic.keys() and dic[complement] != i:
                return [i, dic[complement]]
        return [] # 不存在的情况

class Solution3:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dic = {}
        for i in range(0, len(nums)):
            complement = target - nums[i]
            if complement in dic.keys():
                return [dic[complement], i]
            dic[nums[i]] = i

if __name__ == '__main__':
    solution = Solution()
    nums = [3, 2, 4]
    target = 6
    res = solution.twoSum(nums, target)
    print(res)

LeetCode 1 Two Sum
http://fanyfull.github.io/2021/07/09/LeetCode-1-Two-Sum/
作者
Fany Full
发布于
2021年7月9日
许可协议