第一题:两数之和

131 阅读1分钟

file

好久没刷题了,每次刷都有新的领悟。

这次选择刷leetcode top100

刷leetcode top100 第一轮 第一题

前言

“故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。”------《劝学》

思路01:暴力破解

两个循环

代码:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(0,len(nums)):
            for j in range(i, len(nums)):
                if nums[i] + nums[j] == target and nums[i] != nums[j]:
                    return [i,j]

复杂度分析

时间复杂度:O(N^2),其中 N 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。
空间复杂度:O(1)。

思路02:哈希表

把所有数字都放入一个字典中,然后遍历nums,如果字典里有target-nums[i],那就返回i和这个数的索引

代码:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        map = {}
        for i in range(0,len(nums)):
            sub_num = target - nums[i]
            if sub_num in map:
                return [map[sub_num],i]
            else:
                map[nums[i]] = i

复杂度分析

时间复杂度:O(N),其中 NN 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x。
空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。

发布!