
Python与Leetcode刷题
文章平均质量分 71
关于Python语言的一切,多以编程题为主
cnhwl
这个作者很懒,什么都没留下…
展开
-
Leetcode 数据结构与算法题解大全——目录(推荐收藏,持续更新)
为了方便查找我写过的题解,就按照不同类型将其归类,这里做个目录置顶。链表:链表基础概念与经典题目(Leetcode题解-Python语言)哈希表:哈希表(散列表)python描述与leetcode题解笔记之上——原理与设计哈希表(散列表)python描述与leetcode题解笔记之中——实际应用哈希表(散列表)python描述与leetcode题解笔记之下——设计键二叉树:二叉树N叉数的前中后序遍历总结,python实现递归法和迭代法从前中后序遍历构造二叉树,三题无脑秒杀二叉树层序遍历一原创 2021-11-04 22:18:47 · 1748 阅读 · 2 评论 -
Python 中的迭代器(iter、next)与生成器(yield)解析
迭代器从集合的第一个元素开始访问,直到所有的元素被访问完结束,并且只能往前不会后退。注意 for 循环接收的只是可迭代对象而不是迭代器,所以实际上 for 循环帮我们同时完成了。方法对其进行迭代,如果迭代器的内容已经全部迭代完了,就会返回一个。,因为可迭代的对象(如列表、元组、字典、集合和字符串),得先使用。就是一个返回迭代器的函数,只能用于迭代操作,更简单点理解。既然能处理可迭代对象,当然也可以处理迭代器,如下。,而数字就不是可迭代的。,用于迭代列表、元组、字典、集合和字符串等。...原创 2022-08-15 23:04:24 · 1936 阅读 · 0 评论 -
Python 中的 *args 和 **kwargs 解析
函数 myFun 定义为先接收非关键字参数 args,再接收关键字参数 kwargs,所以在调用语句中,前三个字符串被看作是非关键字参数(args),后三个则被看作是关键字参数(kwargs)。实际上就是先用列表 args 中的元素作为非关键字参数调用了一次函数,然后再用字典 kwargs 中的元素作为关键字参数调用一次函数。Python 中传入函数的参数主要分为。...原创 2022-08-14 22:43:53 · 551 阅读 · 0 评论 -
LEETCODE PATTERNS & Neetcode 刷题记录(Leetcode题解-Python语言)
LEETCODE PATTERNS 官网在这个链接,Neetcode 官网在这个链接题目页面解法一:蛮力解法,从头开始遍历数组中的元素,对于每个元素,都将其与后面的所有元素进行比较,若有重复则返回 True,可知此解法时间复杂度为O(n2)O({n^2})O(n2),空间复杂度为 O(1)O(1)O(1)解法二:排序后遍历,将数组排序之后,重复的元素一定是相邻的,所以很容易比较出来,但排序需要时间开销,所以此解法时间复杂度为 O(nlogn)O(n\log n)O(nlogn),空间复杂度为 O(1)O(原创 2022-04-18 12:34:10 · 3415 阅读 · 0 评论 -
回溯的问题合集(Leetcode题解-Python语言)
78. 子集class Solution: def subsets(self, nums: List[int]) -> List[List[int]]: ans = [] cur = [] def dfs(i): if i == len(nums): ans.append(cur.copy()) return原创 2022-04-15 21:59:25 · 544 阅读 · 0 评论 -
二叉树最近公共祖先相关题目(Leetcode题解-Python语言)
236. 二叉树的最近公共祖先class Solution: def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': def dfs(root: 'TreeNode', p: 'TreeNode', q: 'TreeNode'): # 如果当前节点为空,则说明 p、q 不在 node 的子树中,不可能为公共祖先,直接返回原创 2022-03-31 13:31:28 · 1283 阅读 · 0 评论 -
每天一小时python官方文档学习(五)————数据结构之元组、集合与字典
昨天介绍完了最常用的列表,之后就是次常用的元组、集合与字典了。5.3. 元组和序列元组和之前讲过的列表有很多共同特性,例如索引和切片操作。实际上,他们是 序列 数据类型(list, tuple, range)中的两种。一个元组由几个被逗号隔开的值组成,例如:>>> t = 12345, 54321, 'hello!' # 元组打包>>> t[0]12...原创 2020-04-20 14:33:31 · 219 阅读 · 0 评论 -
每天一小时python官方文档学习(一)————python的简单介绍
我们都知道,python的官方文档写得十分详尽,也是每一个学习python的人都绕不开的。所以从今天开始,我每天都会用一小时学习python的官方文档,按照文档目录的顺序,摘录一些有用的语句,写下一些个人心得放在博客里,python版本为3.8.2,文档地址如下:https://docs.python.org/zh-cn/3/index.html1.课前甜点Python是一种解释型语言,在...原创 2020-04-15 14:38:28 · 566 阅读 · 0 评论 -
每天一小时python官方文档学习(二)————流程控制工具
4. 其他流程控制工具4.1. if 语句大多数人都很熟悉的if语句:if condition1: passelif condition2: passelse condition3: pass注意python中没有switch或case语句,所以一个 if ... elif ... elif ... 序列可以看作是其他语言中的 switch 或 case 语句的替代。4.2....原创 2020-04-17 12:28:20 · 236 阅读 · 0 评论 -
每天一小时python官方文档学习(三)————函数
上一天看到第四章的一半,介绍了一些常用的流程控制工具,也就是常用语句,主要是if、for、range()、break、continue、else和pass。今天把第四章剩下的看完,讲的是如何在python中定义和使用函数。函数其实就是一种对代码的封装,对于一段完成某种功能的代码,如果需要在程序中多次用到这个功能,不使用函数的话,就要写多次相同的代码,很麻烦;如果使用函数的话,定义函数只需要一次,往...原创 2020-04-18 14:36:51 · 309 阅读 · 0 评论 -
每天一小时python官方文档学习(四)————数据结构之列表
终于进入到第五章数据结构部分了,python中常用的容器有列表、元组、集合和字典,今天主要了解的是最为常用的列表。5. 数据结构5.1. 列表的更多特性对于列表的操作有很多,具体操作看官方文档就行,但是我们对列表有什么操作,是应该有个印象的,否则需要用到的时候不知道有这种操作,自然也谈不上查文档了。通过list()或者中括号[]来新建一个列表;通过clear()删除列表中所有的元素在列...原创 2020-04-19 14:51:55 · 423 阅读 · 0 评论 -
每天一小时python官方文档学习(六)————循环和条件控制的进阶用法
学习完数据结构之后,我们就能够对之前在第二天中讲过的流程控制工具,添加更多的用法了,这里主要介绍的是for循环语句和if与while条件判断语句。5.6. 循环的技巧我们学过的遍历序列for i in range() 、for i in list() 和 for i in tuple(),都是每次只取出一个元素。技巧性更强的是一次取出两个元素,尤其以字典为例:>>> kni...原创 2020-04-21 14:28:31 · 259 阅读 · 0 评论 -
每天一小时python官方文档学习(七)————模块与包
6. 模块模块是一个包含Python定义和语句的文件,实际上就是一个正常的.py文件。但是作用和普通需要运行的程序不一样,它实际上有点像函数。如果说函数实现了代码的重用,模块则是实现了函数的重用。我们如果想在不同的程序中使用同一个函数, 不必把这个函数复制到每一个程序中去,而是通过把函数写在一个模块中,然后程序通过导入模块就可以使用这个函数了。模块文件名就是模块名后跟文件后缀 .py 。在一个...原创 2020-04-22 12:22:21 · 438 阅读 · 0 评论 -
两数、三数、四数之和相关题目(Leetcode题解-Python语言)
作为 Leetcode 的第一题,两数之和自然是知名度最高的,从两数之和出发也有不少的衍生题目,下面就让我们好好地解决它们。1. 两数之和class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: record = dict() for i, num in enumerate(nums): if target - num in record:原创 2022-03-27 19:47:04 · 1430 阅读 · 0 评论 -
字符串匹配经典题目——KMP算法(Leetcode题解-Python语言)
28. 实现 strStr()strStr(haystack: str, needle: str) 的作用就是在 haystack 字符串(长度为 n)中找出 needle 字符串(长度为 m)出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 ;如果 needle 是空字符串,则返回 0。 Python 中对应的写法是 haystack.find(needle)。如果让我们自己实现这个函数,最简单的思路就是对 haystack 字符串中每个字符的位置,都用 needle 字符串试着去匹配原创 2022-03-16 13:34:36 · 2473 阅读 · 0 评论 -
字符串经典题目(Leetcode题解-Python语言)
344. 反转字符串class Solution: def reverseString(self, s: List[str]) -> None: """ Do not return anything, modify s in-place instead. """ left = 0 right = len(s) - 1 while left < right: s[lef原创 2022-03-15 22:25:03 · 901 阅读 · 0 评论 -
贪心的问题合集(Leetcode题解-Python语言)
贪心算法(Greedy Algorithm):是一种在每次决策时采用当前状态下最优或最好的策略,从而希望导致结果是最好或最优的算法。455. 分发饼干class Solution: def findContentChildren(self, g: List[int], s: List[int]) -> int: g.sort(reverse=True) s.sort(reverse=True) p1, p2 = 0, 0 an原创 2022-03-10 16:50:56 · 1236 阅读 · 0 评论 -
队列的基础概念与经典题目(Leetcode题解-Python语言)
队列是先入先出(后入后出)的数据结构,常用操作就 push 和 popleft,Python中用列表中的 pop(0) 或者 collection.deque的 popleft() 都可以。普通队列225. 用队列实现栈class MyStack: def __init__(self): self.queue1 = [] self.queue2 = [] self.size = 0 def push(self, x: int) -&g原创 2022-03-10 15:28:54 · 1109 阅读 · 0 评论 -
在数组中找重复数、只出现一次的数或丢失数的题目(Leetcode题解-Python语言)
在一维数组中的考察中,最常见的就是找出数组中的重复数、只出现一次的数或者丢失(消失)数等等。一般来说,首先想到的就是用哈希表(集合)来记录出现过的数,基本所有的题都可以用集合来做,而技巧性在于有时可以把原数组自身作为哈希表;其次就是位运算,原理是相同的数做异或运算 ^ 会得到0,而一个数与0做异或会得到这个数本身;最后,在排好序或者对空间要求为O(1)但又不能修改原数组的情况下,二分查找也是一种方法。136. 只出现一次的数字(找出一个只出现一次的数字)class Solution: de原创 2022-02-08 16:27:17 · 1126 阅读 · 0 评论 -
子串、子数组与子序列类型问题的动态规划求解(Leetcode题解-Python语言)
一般来说,子串和子数组都是连续的,而子序列是可以不连续的,遇到子序列问题基本上都是用动态规划求解。53. 最大子数组和(剑指 Offer 42. 连续子数组的最大和)class Solution: def maxSubArray(self, nums: List[int]) -> int: n = len(nums) dp = [-10001] * (n+1) dp[0] = nums[0] for i in range(1原创 2021-12-07 18:25:55 · 1019 阅读 · 0 评论 -
栈的基础概念与经典题目(Leetcode题解-Python语言)
栈是先入后出(后入先出)的数据结构,常用操作就 push 和 pop,Python中用列表实现即可,基本概念可以看Leetbook相关章节。155. 最小栈(剑指 Offer 30. 包含min函数的栈)class MinStack: def __init__(self): self.stack = [(0, float('+inf'))] def push(self, x: int) -> None: self.stack.append((x,原创 2021-12-06 11:55:28 · 503 阅读 · 0 评论 -
快速幂算法相关题目(Leetcode题解-Python语言)
50. Pow(x, n)快速幂算法的目的,就是快速计算 x 的 n 次方。基本思路是把 n 视作二进制数,则 n 可以被分解为多个 2 的幂次方之和,如 12 对应 1100 等于 0∗20+0∗21+1∗22+1∗230*{2^0} + 0*{2^1} + 1*{2^2} + 1*{2^3}0∗20+0∗21+1∗22+1∗23,即二进制数中每一位的0或1对应的正是系数。因此,x12=x0∗20+x0∗21+x1∗22+x1∗23{x^{12}} = {x^{0*{2^0}}} + {x^{0*{2^原创 2021-12-05 20:23:01 · 661 阅读 · 0 评论 -
矩阵模拟问题合集(Leetcode题解-Python语言)
54. 螺旋矩阵class Solution: def spiralOrder(self, matrix: List[List[int]]) -> List[int]: ans = [] count = 0 m, n = len(matrix), len(matrix[0]) length = m * n directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]原创 2021-12-01 21:41:12 · 639 阅读 · 0 评论 -
一般动态规划问题合集(Leetcode题解-Python语言)
118. 杨辉三角class Solution: def generate(self, numRows: int) -> List[List[int]]: dp = [[0] * i for i in range(1, numRows+1)] for i in range(numRows): for j in range(len(dp[i])): # 左右两边是1,中间部分就是其上方两个数之和原创 2021-11-30 18:46:06 · 340 阅读 · 0 评论 -
买卖股票类问题动态规划解法(Leetcode题解-Python语言)
在 Leetcode 中,关于买卖股票的问题共有6道,而这些题目是可以用相同的思维进行求解的,强烈推荐这篇总结,写得非常到位。股票类问题的动态规划分三步走,1、首先明确方程的含义,T[i][k][0]:表示在第 i 天结束时,最多进行 k 次交易且在进行操作后持有 0 份股票的情况下可以获得的最大收益;T[i][k][1]:表示在第 i 天结束时,最多进行 k 次交易且在进行操作后持有 1 份股票的情况下可以获得的最大收益。2、初始(基准)情况:T[-1][k][0] = 0, T[-1][k][原创 2021-11-29 21:47:03 · 3373 阅读 · 1 评论 -
爬楼梯与路径类题目记忆化递归与动态规划双解法(Leetcode题解-Python语言)
70. 爬楼梯(剑指 Offer 10- II. 青蛙跳台阶问题)递归(英语:Recursion),是指在函数的定义中使用函数自身的方法。有意义的递归通常会把问题分解成规模缩小的同类子问题,当子问题缩写到寻常的时候,我们可以直接知道它的解。然后通过建立递归函数之间的联系(转移)即可解决原问题。而记忆化递归,就是用数组或者哈希表记录下递归过程中的计算结果,避免重复计算。以爬楼梯为例,我们想知道爬 n 阶楼梯的方案数 f(n),由于每次只能爬 1 阶或 2 阶楼梯,所以其实如果知道爬 n - 1 阶和 n原创 2021-11-12 20:13:36 · 1349 阅读 · 0 评论 -
二叉树序列化与反序列化相关题目(Leetcode题解-Python语言)
297. 二叉树的序列化与反序列化(剑指 Offer 37. 序列化二叉树)(剑指 Offer II 048. 序列化与反序列化二叉树)class Codec: def serialize(self, root): """Encodes a tree to a single string. :type root: TreeNode :rtype: str """ if not root:原创 2021-11-10 13:12:28 · 1285 阅读 · 0 评论 -
最小堆最大堆基础概念与经典题目(Leetcode题解-Python语言)
堆是一种特别的完全二叉树,符合以下两个定义即为堆:1、完全二叉树;2、每一个节点的值都必须大于等于或者小于等于其孩子节点的值。若是大于等于,即为最大堆,若是小于等于,即为最小堆。显然,最大堆的根节点是最大值,最小堆的根节点是最小值。深度为kkk的二叉树至多总共有2k+1{2^{k + 1}}2k+1个节点(定义根节点所在深度k0{k_0}k0=0),节点数正好是2k+1{2^{k + 1}}2k+1的二叉树就称为满二叉树;如果对满二叉树的节点编号,有二叉树的节点可以与编号一一对应的话,该二叉树就称为原创 2021-11-07 20:37:48 · 1286 阅读 · 0 评论 -
链表基础概念与经典题目(Leetcode题解-Python语言)
所谓链表,就是由链节点元素组成的表,那什么是链节点呢?直接上定义:class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next很简单,链节点就是只记录自身的值 val,还有其指向的下一个链节点的位置 next。707. 设计链表class ListNode: def __init__(self, val=0, next=None):原创 2021-11-04 16:33:42 · 902 阅读 · 1 评论 -
高度平衡的二叉搜索树基础概念与经典题目(Leetcode题解-Python语言)
高度平衡的二叉搜索树(平衡二叉树),定义见此Leetbook。简单来说,就是基于相同节点值构建出来的二叉搜索树中高度最小的,即为平衡二叉树(不唯一)。有 N 个节点的平衡二叉搜索树,它的高度是 logN 。并且,每个节点的两个子树的高度不会相差超过 1。108. 将有序数组转换为二叉搜索树(面试题 04.02. 最小高度树)class Solution: def sortedArrayToBST(self, nums: List[int]) -> TreeNode: if原创 2021-10-28 18:27:29 · 570 阅读 · 0 评论 -
二叉搜索树基础概念与经典题目(Leetcode题解-Python语言)
二叉搜索树,首先上定义:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。而二叉搜索树最有用的性质就是,对其中序遍历可以得到一个递增的有序序列。更多的内容,可以到这个Leetbook当中学习。98. 验证二叉搜索树验证二叉搜索树,第一种方法是从定义出发:class Solution: def isValidBST(self, root: TreeNode) -> bool: def bounder原创 2021-10-28 00:36:40 · 429 阅读 · 0 评论 -
二叉树的几道相似简单递归题
二叉树中递归的思想,在这本Leetbook中讲的很细了,这里不展开。下面是几道例题:100. 相同的树class Solution: def isSameTree(self, p: TreeNode, q: TreeNode) -> bool: if (not p) and (not q): return True elif (not p) or (not q): return False el原创 2021-10-24 18:25:21 · 2197 阅读 · 0 评论 -
二分查找基础概念与经典题目(Leetcode题解-Python语言)二分数值型
二分查找的讲解请见上一篇文章。本文主要记录对数值进行二分的题目解法与思路。374. 猜数字大小class Solution: def guessNumber(self, n: int) -> int: left = 1 right = n while left < right: mid = left + (right - left) // 2 if guess(mid) == 1: # m原创 2021-07-25 22:26:22 · 127 阅读 · 0 评论 -
岛屿类问题的广度优先深度优先双解法(Leetcode题解-Python语言)
695. 岛屿的最大面积先上最经典的题目,详细思路看这题的官方题解,简单来说的岛屿问题就是遍历二维数组,一般都是从一块陆地开始,进行深度优先或者广度优先搜索,每次上下左右四个方向选其一寻找下一块陆地,最后找到一个岛屿(一片陆地)。...原创 2021-07-24 17:10:02 · 1414 阅读 · 0 评论 -
二分查找基础概念与经典题目(Leetcode题解-Python语言)二分索引型
二分查找的定义如下(引自Wiki):在计算机科学中,二分查找算法(英语:binary search algorithm),也称折半搜索算法(英语:half-interval search algorithm)、对数搜索算法(英语:logarithmic search algorithm),是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从原创 2021-07-19 22:40:28 · 561 阅读 · 1 评论 -
哈希表(散列表)基础概念与经典题目(Leetcode题解-Python语言)之下——设计键
在很多应用中,我们会发现某种映射关系(模式),但它并不是简单一 一对应的。这时,我们就要从键 key 入手,通过设计合适的键,建立映射关系。leetbook的这个章节总结了一些常见的键,以供参考。49. 字母异位词分组class Solution: def groupAnagrams(self, strs: List[str]) -> List[List[str]]: hashtable = dict() for s in strs:原创 2021-07-18 12:21:19 · 344 阅读 · 0 评论 -
哈希表(散列表)基础概念与经典题目(Leetcode题解-Python语言)之中——实际应用
上一节介绍了哈希表的原理与设计方法,这一节则直接python中现有的哈希表类型:哈希集合 set(集合)和哈希映射 dict(字典)来解决实际应用(刷题)。零、概念在介绍实际应用之前,有一个概念我认为是应该了解的,那就是可哈希(hashable)。官方的术语介绍如下:一个对象的哈希值如果在其生命周期内绝不改变,就被称为 可哈希 (它需要具有 __hash__() 方法),并可以同其他对象进行比较(它需要具有 __eq__() 方法)。可哈希对象必须具有相同的哈希值比较结果才会相同。可哈希性使得对象能原创 2021-07-17 19:54:04 · 662 阅读 · 1 评论 -
python编程中的小问题汇总
前言本文记录了我在python编程中遇到的各种小问题,持续更新。1. x = x + 1 VS x += 1辨析下面这两段代码:>>> x = y = [1, 2, 3, 4]>>> x += [4]>>> x[1, 2, 3, 4, 4]>>> y[1, 2, 3, 4, 4]>>> x = y = [1, 2, 3, 4]>>> x = x + [4]>>&g原创 2021-07-17 19:32:51 · 989 阅读 · 2 评论 -
哈希表(散列表)基础概念与经典题目(Leetcode题解-Python语言)之上——原理与设计
哈希表(Hash table,也叫散列表),是根据键(Key)而直接访问数据在内存中的储存位置(又叫做存储桶,Buckets)的数据结构。也就是说,它通过计算一个关于键值的函数(哈希函数,Hash function,也叫散列函数),将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度,存放记录的数组就叫做哈希表。最直观的例子,我们的手机通讯录中,如果王某某的电话号码是12345678910,我们只需要记个王某某:12345678910,以后直接找王某某就可以找到他的电话号码了。哈希表可以在O(1)原创 2021-07-17 13:17:59 · 599 阅读 · 0 评论 -
从前中后序遍历构造二叉树,三题无脑秒杀
如果只是前中后序遍历的其中一种,是不可能唯一确定一个二叉树的,必须是其中两个的结合,由此便产生了三道题目,在这里可以全部秒杀。需要记住的要点是:前序(根左右)——第一个节点一定是根节点;中序(左根右)——根节点左边一定是左子树,右边一定是右子树;后序(左右根)——最后一个节点一定是根节点。树节点类定义如下:class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val原创 2021-07-12 20:28:48 · 222 阅读 · 0 评论