随笔分类 -  leetcode

摘要:题目链接 解题思路:回溯,尝试每一种可能,process(s, i),划分s[i...],当前的回文子串有哪些情况?单独一个i,或者i, i+1,或者i, i+1, i+2,因此,用一个for循环解决。然后再检查[i, j]是否是回文子串,如果是,则继续递归,划分下一个回文子串process(s, 阅读全文
posted @ 2024-12-27 10:30 ouyangxx 阅读(16) 评论(0) 推荐(0)
摘要:题目链接 解题思路:通常想法是,把哪些'O'变成'X',这种想法很难做。一个比较简单点是,「哪些'O'不能变成'X'」。其实就是与第一行,最后一行,第一列,最后一列,「相邻的这些」'O',不能变成'X',其他的都能变成' X'. 具体来说,把第一行、最后一行、第一列、最后一列的'O',通过「感染」函 阅读全文
posted @ 2024-12-26 18:29 ouyangxx 阅读(16) 评论(0) 推荐(0)
摘要:题目链接 解题思路:难点在于时间复杂度O(n),如果直接排序,题目就简单了。但是不需要全部有序,只需要每次从其中拿出一个数,是递增的即可,也就是说,使用优先级队列,堆头是最小值。注:该方法仍然是O(n*logn) 代码 class Solution: def longestConsecutive(s 阅读全文
posted @ 2024-12-26 16:54 ouyangxx 阅读(27) 评论(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 阅读(24) 评论(0) 推荐(0)
摘要:题目链接 解题思路:二叉树递归套路,以某个节点node为根,最大路径是什么? 1️⃣与node无关,也就是说,不经过node 左子树的最大值,与右子树的最大值,较大的那个,就是结果 2️⃣与node有关 单独node一个节点 经过左子树 经过右子树 左右子树都经过 所以我们需要的信息就两个:tota 阅读全文
posted @ 2024-12-26 16:00 ouyangxx 阅读(43) 评论(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 阅读(15) 评论(0) 推荐(0)
摘要:题目链接 解题思路:计算所有,在i卖出,利润最大为多少,求出的所有结果中,最大的那个,就是最终的结果。那么在i卖出,利润最大为多少?就是[0, i - 1]价格最低的时候。 代码 class Solution: def maxProfit(self, prices: List[int]) -> in 阅读全文
posted @ 2024-12-26 15:03 ouyangxx 阅读(23) 评论(0) 推荐(0)
摘要:题目链接 解题思路:不要被「形状」所迷惑,其实就是,第i行(从0开始),一共有i + 1个数,第一个数和最后一个数是1,其余的数是上一行,「相同位置」+「左边一个位置」。 代码 class Solution: def generate(self, numRows: int) -> List[List 阅读全文
posted @ 2024-12-26 14:45 ouyangxx 阅读(16) 评论(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 阅读(15) 评论(0) 推荐(0)
摘要:题目链接 解题思路:这里面有一个构造「平衡二叉树」,似乎很难。实际上,我们每次构造时都拿中点划分,就能得到平衡的。 具体来说process(nums, L, R)在nums[L, R]上构造平衡搜索二叉树,我们以中点mid=(R+L)/2是头,然后左节点process(nums, L, mid - 阅读全文
posted @ 2024-12-25 17:50 ouyangxx 阅读(28) 评论(0) 推荐(0)
摘要:题目链接 解题思路:首先我们得知道人工怎么建这棵树。先序遍历[0, R1]第一个节点,就是根。然后我们在中序遍历[0, R2]找到根的位置,假如是x,那么,中序遍历中[0, x-1]就是左子树,中序遍历中[x+1, R2]就是右子树。那么先序遍历呢?左子树节点个数是x个,先序遍历是要先遍历完左子树, 阅读全文
posted @ 2024-12-25 17:37 ouyangxx 阅读(48) 评论(0) 推荐(0)
摘要:题目链接 解题思路:做类似的二叉树的题,一定要有宏观的思路,不要陷入局部。例如,要「公平」对待每个节点,每个节点,可以单独看作「以该节点为根」的二叉树。本题目最大深度,我们单独看某一个节点,其实就是,max(左子树的深度,右子树的深度) + 1,那么左子树的深度,和右子树的深度怎么求?直接递归调用即 阅读全文
posted @ 2024-12-25 17:08 ouyangxx 阅读(17) 评论(0) 推荐(0)
摘要:题目链接 解题思路:和层序遍历有明显的不同。通过观察,可以得到,当前层,和下一层的顺序是「相反」的,遇到这种相反的问题,考虑用栈。本题就是用两个栈,一个栈在放入时,先放左儿子,再放右儿子,另一个栈在放入时,先放右儿子,再放左儿子。然后两个栈交替使用即可。 为什么能得到这个思路?观察得到的 代码 cl 阅读全文
posted @ 2024-12-25 17:00 ouyangxx 阅读(25) 评论(0) 推荐(0)
摘要:题目链接 解题思路:层序遍历就用队列,唯一需要注意的就是,要每一层单独收集,所以要用一个变量,记录每一层需要收集的数目,同时还要记录下一层需要收集的数目 代码 class Solution: def levelOrder(self, root: Optional[TreeNode]) -> List 阅读全文
posted @ 2024-12-25 16:43 ouyangxx 阅读(18) 评论(0) 推荐(0)
摘要:题目链接 解题思路:递归的思路,就是左子树和右子树的值相等,同时,左子树的左子树与右子树的右子树要相似,左子树的右子树与右子树的左子树要相似。看代码很清晰 代码 class Solution: def process(self, node1, node2) -> bool: if node1 == 阅读全文
posted @ 2024-12-25 16:25 ouyangxx 阅读(18) 评论(0) 推荐(0)
摘要:题目链接 解题思路:以某个节点为头,是否是搜索二叉树?其实就是问子树要信息 左子树:最大值,最小值,左子树整体是否是搜索二叉树? 右子树:最大值,最小值,右子树整体是否是搜索二叉树 得到信息后,再处理就行,详细处理看代码 代码 class Solution: class Info: def __in 阅读全文
posted @ 2024-12-25 15:59 ouyangxx 阅读(27) 评论(0) 推荐(0)
摘要:题目链接 解题思路:中序遍历:左中右,用一个栈,同时用空来标识「中」,所以入栈顺序就是右->中->None->左 代码 class Solution: def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]: # 使用栈 # 阅读全文
posted @ 2024-12-25 15:09 ouyangxx 阅读(18) 评论(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 阅读(58) 评论(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 阅读(23) 评论(0) 推荐(0)
摘要:题目链接 解题思路:单调栈,以i位置为高度(宽),最长能有多长,其实就是找离i最近的,小于i的位置,其实就是单调栈 代码 class Solution: def largestRectangleArea(self, heights: List[int]) -> int: # 使用单调栈 栈底到栈顶 阅读全文
posted @ 2024-12-24 15:35 ouyangxx 阅读(14) 评论(0) 推荐(0)