LeetCode 1 两数之和

大四保研规划

由于保研之后,确实闲来无事,又深觉卷了三年绩点之后,技术基本上没有怎么长进,所以打算通过刷力扣来提升自己的编程的能力。考虑到未来科研以及可能从事的方向,我计划用python来进行编程(非科班,基本上零基础进行编程)。

两数之和

基础算法

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        #获取数组长度
        n=len(nums)
        for i in range(n):
            for j in range(i+1,n):
                if nums[i]+nums[j]==target:
                    return [i,j]
        # 如果没有找到答案,返回空列表 
        return []

类中定义函数,传入参数是 List列表,通过len()函数来获取列表长度,
range(5)等价于range(0, 5),是[0, 1, 2, 3, 4]没有5。(左闭右开)
range函数还可以引入步长来进行索引。

时间复杂度

大O符号表示法中,时间复杂度的公式是: T(n) = O( f(n) ),其中f(n) 表示每行代码执行次数之和,而 O 表示正比例关系,这个公式的全称是:算法的渐进时间复杂度。
n无限大的时候,T(n) = time(1+2n)中的常量1就没有意义了,倍数2也意义不大。因此直接简化为T(n) = O(n) 就可以了。所以当一个循环有多行代码时,可以近似为1行代码,也就是执行次数指的是循环次数。
运算次数:(n-1)+…+(0)=(0+n-1)*n/2;
所以时间复杂度为O(n^2)

空间复杂度

如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)。
空间复杂度:O(1)。

进阶算法 哈希表

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        d = dict()#构建字典
        for i, num in enumerate(nums):           #返回 enumerate(枚举) 对象,下标i(0开始计数),数
            if target - num in d:                          #如果target - num在字典中(前面枚举的数中)
                return [d[target - num], i]				#则返回
            d[nums[i]] = i                                   #添加键值对  num[i](key)=i(value)
        return []

时间复杂度

时间复杂度:O(N),其中 N是数组中的元素数量。对于每一个元素 x,可以 O(1)地寻找 target−x。

空间复杂度

空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。

你可能感兴趣的:(保研,leetcode,算法,职场和发展)