LeetCode刷题笔记(Python3)——1. 两数之和(难度:简单)(2021-05-09)

从今天开始,平均每天至少刷一题,并记录自己的收获。

LeetCode算法题——第1题:两数之和
(点击查看题目)
(点击查看官方题解)

两种解法:

# 解法1:暴力求解法 -> 时间复杂度:O(N^2) 空间复杂度:O(1)
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        N = len(nums)
        for i in range(0, N):
            for j in range(i + 1, N):
                if nums[i] + nums[j] == target:
                    return [i, j]
        return []
# 解法2:哈希表法 -> 时间复杂度:O(N) 空间复杂度:O(N)
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashtable = dict() # 定义哈希表,即字典
        for i, num in enumerate(nums):
            if target - num in hashtable:
                return [hashtable[target - num], i]
            hashtable[nums[i]] = i # 定义哈希表(字典)中的一个键对
        return []

题目本身很简单。重点是通过这一题,了解LeetCode的基本机制,顺便学习几个小的知识点。

1. 如何给出系统要求的结果

LeetCode要的输出结果,直接在官方给定的函数中return即可。例如,下面就是官方出题时附的基本代码。只要在该函数后,return需要的结果即可。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:

2. 目前不要过于执着减少自己代码的执行用时

在不改变编程语言类型的前提下,算法计算复杂度越低,执行用时一般越少。但注意,不要过于执着,看到有用时更低的就要比他更低。仅就该题目而言,看其他人的结果(Python,不是Python3),最好的只需要4ms;但同样的代码在我的电脑上需要20ms。所以,LeetCode给出的用时因计算机的性能不同而不同。只要算法达到了最低计算复杂度,没有必要纠结这一点;适当参考即可。

小技巧:在个人代码提交后的提交记录一栏中,左侧最上面一行就是
“执行结果: 通过 显示详情>”
此时,点击显示详情,可以看到此题目所有提交者的执行用时分布图表以及执行消耗内存分布图表。点击图表中的蓝色柱,可以看到对应执行用时或执行消耗内存的范例代码。

3. 如何使用哈希表

Python3中的字典使用的就是哈希表结构,具体用法参考上面的解法2。后续还需要细致理解哈希表的实现方法,这一点有待补充。

4. 如何使用enumerate函数

# for 循环使用 enumerate
seq = ['one', 'two', 'three']
for i, element in enumerate(seq):
	print i, element
# results:
# 0 one
# 1 two
# 2 three

5. 规定形参数据类型的“List”报错的解决方案

编程时,函数中规定形参数据类型的“List”可能会报错“Unresolved reference ‘List’ ”(未解决的参考“List”)。此时,只需要在程序开头添加下面的代码即可。

from typing import List

6. range函数加速的小技巧

range(N)
range(0, N) # 这种用法速度更快

上述两种方法中后者的速度更快。在该题目中,使用第二行的代码比使用第一行的代码要快上4ms。

猜你喜欢

转载自blog.csdn.net/AbaloneVH/article/details/116568983
今日推荐