随笔分类 -  leetcode / leetcode高频题

摘要:题目链接 解题思路:难点在于时间复杂度O(n),如果直接排序,题目就简单了。但是不需要全部有序,只需要每次从其中拿出一个数,是递增的即可,也就是说,使用优先级队列,堆头是最小值。注:该方法仍然是O(n*logn) 代码 class Solution: def longestConsecutive(s 阅读全文
posted @ 2024-12-26 16:54 ouyangxx 阅读(5) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:双指针,一个一个对比,跳过非数字字母,对比时,忽略大小写 代码 class Solution: def isPalindrome(self, s: str) -> bool: # 双指针 i, j = 0, len(s) - 1 while i < j: # 跳过非字母和数字字符 阅读全文
posted @ 2024-12-26 16:19 ouyangxx 阅读(6) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:二叉树递归套路,以某个节点node为根,最大路径是什么? 1️⃣与node无关,也就是说,不经过node 左子树的最大值,与右子树的最大值,较大的那个,就是结果 2️⃣与node有关 单独node一个节点 经过左子树 经过右子树 左右子树都经过 所以我们需要的信息就两个:tota 阅读全文
posted @ 2024-12-26 16:00 ouyangxx 阅读(8) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:来到i天,如果i的价格大于i-1的价格,那么就可以赚到差价。所以,遍历的过程中,只要prices[i] > prices[i - 1],那么就可以获利了 代码 class Solution: def maxProfit(self, prices: List[int]) -> in 阅读全文
posted @ 2024-12-26 15:12 ouyangxx 阅读(4) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:计算所有,在i卖出,利润最大为多少,求出的所有结果中,最大的那个,就是最终的结果。那么在i卖出,利润最大为多少?就是[0, i - 1]价格最低的时候。 代码 class Solution: def maxProfit(self, prices: List[int]) -> in 阅读全文
posted @ 2024-12-26 15:03 ouyangxx 阅读(6) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:不要被「形状」所迷惑,其实就是,第i行(从0开始),一共有i + 1个数,第一个数和最后一个数是1,其余的数是上一行,「相同位置」+「左边一个位置」。 代码 class Solution: def generate(self, numRows: int) -> List[List 阅读全文
posted @ 2024-12-26 14:45 ouyangxx 阅读(8) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:其实就是在层序遍历的过程中,把next指针填上 代码 class Solution: def connect(self, root: 'Optional[Node]') -> 'Optional[Node]': if root == None: return None # 层序遍 阅读全文
posted @ 2024-12-26 14:39 ouyangxx 阅读(6) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:这里面有一个构造「平衡二叉树」,似乎很难。实际上,我们每次构造时都拿中点划分,就能得到平衡的。 具体来说process(nums, L, R)在nums[L, R]上构造平衡搜索二叉树,我们以中点mid=(R+L)/2是头,然后左节点process(nums, L, mid - 阅读全文
posted @ 2024-12-25 17:50 ouyangxx 阅读(11) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:首先我们得知道人工怎么建这棵树。先序遍历[0, R1]第一个节点,就是根。然后我们在中序遍历[0, R2]找到根的位置,假如是x,那么,中序遍历中[0, x-1]就是左子树,中序遍历中[x+1, R2]就是右子树。那么先序遍历呢?左子树节点个数是x个,先序遍历是要先遍历完左子树, 阅读全文
posted @ 2024-12-25 17:37 ouyangxx 阅读(8) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:做类似的二叉树的题,一定要有宏观的思路,不要陷入局部。例如,要「公平」对待每个节点,每个节点,可以单独看作「以该节点为根」的二叉树。本题目最大深度,我们单独看某一个节点,其实就是,max(左子树的深度,右子树的深度) + 1,那么左子树的深度,和右子树的深度怎么求?直接递归调用即 阅读全文
posted @ 2024-12-25 17:08 ouyangxx 阅读(7) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:和层序遍历有明显的不同。通过观察,可以得到,当前层,和下一层的顺序是「相反」的,遇到这种相反的问题,考虑用栈。本题就是用两个栈,一个栈在放入时,先放左儿子,再放右儿子,另一个栈在放入时,先放右儿子,再放左儿子。然后两个栈交替使用即可。 为什么能得到这个思路?观察得到的 代码 cl 阅读全文
posted @ 2024-12-25 17:00 ouyangxx 阅读(4) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:层序遍历就用队列,唯一需要注意的就是,要每一层单独收集,所以要用一个变量,记录每一层需要收集的数目,同时还要记录下一层需要收集的数目 代码 class Solution: def levelOrder(self, root: Optional[TreeNode]) -> List 阅读全文
posted @ 2024-12-25 16:43 ouyangxx 阅读(11) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:递归的思路,就是左子树和右子树的值相等,同时,左子树的左子树与右子树的右子树要相似,左子树的右子树与右子树的左子树要相似。看代码很清晰 代码 class Solution: def process(self, node1, node2) -> bool: if node1 == 阅读全文
posted @ 2024-12-25 16:25 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:以某个节点为头,是否是搜索二叉树?其实就是问子树要信息 左子树:最大值,最小值,左子树整体是否是搜索二叉树? 右子树:最大值,最小值,右子树整体是否是搜索二叉树 得到信息后,再处理就行,详细处理看代码 代码 class Solution: class Info: def __in 阅读全文
posted @ 2024-12-25 15:59 ouyangxx 阅读(6) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:中序遍历:左中右,用一个栈,同时用空来标识「中」,所以入栈顺序就是右->中->None->左 代码 class Solution: def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]: # 使用栈 # 阅读全文
posted @ 2024-12-25 15:09 ouyangxx 阅读(8) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:动态规划:从左往右的尝试模型,来到index位置,只解码index一个数,或者解码index和index+1两个数 代码 class Solution: # 只需要解码s[index...]即可 def process(self, s: str, index: int, dp: 阅读全文
posted @ 2024-12-24 16:21 ouyangxx 阅读(22) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:从后往前填数字即可 代码 class Solution: def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: # 从后往前开始填充 L = m - 1 # nums1[0, L] 阅读全文
posted @ 2024-12-24 15:55 ouyangxx 阅读(6) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:单调栈,以i位置为高度(宽),最长能有多长,其实就是找离i最近的,小于i的位置,其实就是单调栈 代码 class Solution: def largestRectangleArea(self, heights: List[int]) -> int: # 使用单调栈 栈底到栈顶 阅读全文
posted @ 2024-12-24 15:35 ouyangxx 阅读(4) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:简单的回溯,就是两种情况,要这个数,不要这个数 代码 class Solution: # 现在来到index位置,决定nums[index]要,还是不要,ans是最终的结果,path是一条分支的结果 def process(self, nums: List[int], index 阅读全文
posted @ 2024-12-24 11:15 ouyangxx 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路:以i开头,最小覆盖子串是什么,然后求出所有的结果,最小的便是。先求出i的结果,是[i, j],然后求i+1时,直接从j后遍历即可。 窗口的思想,窗口在[i, j],然后来到i+1,先把i弹出去,弹出去的前提是,s[i]是我们需要的字符。然后再看[i + 1, j]是否满足,如果不 阅读全文
posted @ 2024-12-24 11:01 ouyangxx 阅读(14) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示