- 博客(40)
- 收藏
- 关注
原创 lc202306
对每一个 t=0 就 rot 的 orange dfs,遇见周围未 rot 或 rot 时间较长的 orange 进行处理,对 blank 和 rotten 且时间较短的 orange 结束递归。dp数组保存的数值是每个数字被拆成1~n个的最大乘积,把n拆成3个数(n1, n2, n3)的最大乘积,总可以归结为拆成2个数的最大乘积,所以只用dp求每个数字被拆成2个的最大乘积。遇到一个节点,判断是否被检查过,检查过则跳过,没检查过则dfs。对于单个连通图:一个dfs判断图中所有节点符合二分。
2023-07-10 10:53:19 94
原创 lc0426lc0501
首尾相连没有带来新的取法,环形禁止首尾同时取==单排禁止首尾同时取==[0,n-1]+[1,n]可以首尾同时取。198. 打家劫舍:dp:f(n)= a[ n ] + Max(f(1),f(2)...f(n-2))创建矩阵,Array(m).fill(1222. 可以攻击国王的皇后:模拟。从国王的八个方向分别向外找皇后。类似状态机,贪吃蛇?),注意深浅拷贝的问题。54. 螺旋矩阵:模拟。59. 螺旋矩阵 II。
2023-05-01 18:12:25 84
原创 lc0422lc0423
贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。贪心:每次保证子序列的第一个字符在父序列中找到。解法2:贪心:每次求出当前能覆盖的最大范围。2645. 构造有效字符串的最少插入数。dfs:从终点开始找出所有的可达点。392. 判断子序列。
2023-04-23 15:13:48 76
原创 lc0416lc0417
先确定无前置课程的课程,然后反复遍历检查有前置要求的课程是否符合条件,直至可上的课数量不再增长。和之前岛屿数量思想类似,相连则标0沉岛,出口条件可以从递归的角度思考。机器人移动 -> 轨迹是联通的 -> dfs。面试题13. 机器人的运动范围。
2023-04-22 22:42:28 65
原创 lc0411lc0412lc0413lc0414
y'左 * y'右 < 0 则一定有极值。使用二分法寻找一个y'左 * y'右 < 0的点。34. 在排序数组中查找元素的第一个和最后一个位置。下一个更大的:单调栈,循环:跑完一轮再来一轮。可将前后设为-Infinity方便讨论。任何数字与0异或结果仍然是它本身。503. 下一个更大元素 II。136. 只出现一次的数字。
2023-04-14 16:34:01 57
原创 lc0406lc0409lc0410
元素依次入栈,如果新元素入栈会打破单调性,则栈一直pop到符合单调性,再让新元素入栈。不能只判断左右子节点,每个节点维护一个子树大小range,自下而上判断。236. 二叉树的最近公共祖先:可以用等号判断子树,因为真的是同一棵树。572. 另一棵树的子树:不能直接用等号判断子树,因为是两颗不同的树。最常见的应用场景就是这题的,找到每个数右侧第一个比它大的元素。单调栈:栈中元素保持单调性的栈。
2023-04-10 23:48:43 58
原创 lc0401lc0402
二分查找的目标是一个点,若找分界线可用nums[i]<0&&nums[i+1]>0做找i条件。268. 丢失的数字:排序+二分查找。88. 合并两个有序数组:从后往前。
2023-04-06 18:29:37 47
原创 0331lc
镜像对称<=>正树值==负树值&&正树左子树与负树右子树对称&&&正树右子树与负树左子树对称。维护前后指针指向有可能的区间。类似递归的思考方式:0->1、n->n+1。分层层序遍历:用一个for循环,通过queue的长度控制分层。二分最后的终点,两种情况都是,start==end。分层层序遍历每一层的最后一个元素。102. 二叉树的层序遍历。199. 二叉树的右视图。101. 对称二叉树。35. 搜索插入位置。
2023-04-01 19:51:28 68
原创 lc0324 lc0325
链表最开始用一个哑节点,指向head。快慢指针都从哑节点开始走,以应对head被删掉的情况。用一个前置结点解决讨论返回head是哪个节点的问题。把数字拿出来排序,用字典根据数字查找节点。两数高位次不一样,用0补全处理。
2023-03-26 23:24:39 72
原创 lc0323
(2)有重复则找到重复的字符,从其后第一个开始算新子串。3. 无重复字符的最长子串:dp:维护以当前元素结尾的最长子串。(1) 和前一个最长子串无重复则+1。215. 数组中的第K个最大元素:优化快排。165. 比较版本号:字符串处理。
2023-03-24 00:04:30 60
原创 lc0322
维护一个Store存储所有键值对,维护一个queue排序所有的键,使用到则提前。300. 最长递增子序列:dp:维护以当前数字结尾的最长递增序列。(2)从前一个回文串的起始开始向后寻找可以构成回文串的地方。93. 复原 IP 地址:回溯:展开,剪枝,结束条件。5. 最长回文子串:dp:维护以当前字符结尾的回文串。(1)前面有更小的值:延续前面最长的序列。(2)前面无更小的值:另起一个序列。(1)将前一个回文串前后各延长一个。
2023-03-22 16:34:51 60
原创 2.1lc剑指 Offer 62. 圆圈中最后剩下的数字
剑指 Offer 62. 圆圈中最后剩下的数字。n个数找剩余的问题->n-1个数求剩余的问题。
2023-02-01 00:11:51 81
原创 5.19leetcode662. 二叉树最大宽度
662. 二叉树最大宽度基本思路:层序遍历原来把Null算进去一起遍历,把每行的元素都存下来,超时了。借用完全二叉树给每个节点编号的思想,对于每一层只需要知道第一个节点的编号和最后节点的编号,即可求得题目要求的“宽度”。class Solution: def widthOfBinaryTree(self, root: Optional[TreeNode]) -> int: if not root:return 0 queue = [r.
2022-05-19 22:52:27 154
原创 5.13leetcode15. 三数之和面试题 02.05. 链表求和
15. 三数之和先排序,用三个指针k, i, j。k遍历序列,控制外层循环,i, j为每个k寻找和为-nums[k]的组合,为双指针从两头逼近中间,控制内层循环。class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: def qsort(nums,le,ri): if le<ri: l,r = le,ri
2022-05-13 11:30:54 117
原创 5.12leetcode98. 验证二叉搜索树
98. 验证二叉搜索树每个根节点返回该子树的范围class Solution: def isValidBST(self, root: Optional[TreeNode]) -> bool: if not root:return False def tra(root): if root.left: left_range = tra(root.left) if .
2022-05-12 21:01:47 100
原创 5.9leetcode22. 括号生成17. 电话号码的字母组合543. 二叉树的直径
22. 括号生成回溯:选择(展开树),约束(剪枝),目标(结束回溯)class Solution: def generateParenthesis(self, n: int) -> List[str]: le, ri = 0, 0 res = [] def tra(n, le, ri, tmp): if n==le and n==ri: res.append(tmp) .
2022-05-09 20:09:51 155
原创 4.12leetcode468. 验证IP地址
468. 验证IP地址ord()取ASCII码,chr() 换成字符class Solution: def validIPAddress(self, queryIP: str) -> str: orda,oraf,ordA,ordF,ordz,ordZ = ord('a'),ord('f'),ord('A'),ord('F'),ord('z'),ord('Z') if '.' in queryIP and ':' not in queryIP:.
2022-04-12 21:28:55 144
原创 4.10leetcode剑指 Offer 14- I. 剪绳子5. 最长回文子串
剑指 Offer 14- I. 剪绳子class Solution: def cuttingRope(self, n: int) -> int: dp = [[0]*(n+1) for i in range(n+1)] for i in range(1,n+1): dp[i][1] = i for i in range(2,n+1): for j in range(2,i+1): .
2022-04-10 13:28:22 90
原创 4.9leetcode剑指 Offer 12. 矩阵中的路径343. 整数拆分
剑指 Offer 12. 矩阵中的路径回溯要注意为每个子树建立建立新的资源,避免回溯后不同子树相互影响class Solution: def exist(self, board: List[List[str]], word: str) -> bool: M,N = len(board),len(board[0]) word = list(word) def tra(word,board,m,n,wcur,si):
2022-04-09 23:43:32 318
原创 4.8leetcode912. 排序数组148. 排序链表48. 旋转图像
912. 排序数组归并排序:两两合并,保证每个序列中是有序的class Solution: def sortArray(self, nums: List[int]) -> List[int]: if nums==[]:return [] nums = [[i] for i in nums] def merge(l1,l2):#合并两个排好序的序列 res=[] while l1 a
2022-04-08 14:49:16 425
原创 4.7leetcode剑指 Offer 16. 数值的整数次方19. 删除链表的倒数第 N 个结点
剑指 Offer 16. 数值的整数次方快速幂:二分的思想:底数每次^2, 幂次每次除2class Solution: def myPow(self, x: float, n: int) -> float: if x==0:return 0 res = 1 if n<0: x, n = 1/x, -n while n: if n&1:res*=x
2022-04-07 22:12:29 226
原创 4.1leetcode151. 颠倒字符串中的单词
151. 颠倒字符串中的单词头尾指针class Solution: def reverseWords(self, s: str) -> str: slen = len(s) head, rear = 0,slen-1 while s[head]==" ": head+=1 while s[head]!=" " and head<rear: head+=1
2022-04-01 14:10:03 74
原创 3.31leetcode139. 单词拆分25. K 个一组翻转链表113. 路径总和 II
139. 单词拆分class Solution: def wordBreak(self, s: str, wordDict: List[str]) -> bool: tmp = '' slen = len(s) cur = 0 dp = slen*[0] #1表示该处结束可以拆分 dp1i = [-1] for cur in range(slen): tmp +=
2022-03-31 16:17:43 258
原创 3.30leetcode236. 二叉树的最近公共祖先39. 组合总和141. 环形链表
236. 二叉树的最近公共祖先在二叉搜索树中找公共祖先的时候很容易的就可以判断pq节点分别在根节点的哪边,而在普通二叉树中需要自己实现,实现递归搜索的时候被哪里return搞昏了,递归的正确思考方式:如果下面这两点是成立的,我们就知道这个递归对于所有的n都是正确的:当n=0,1时,结果正确;假设递归对于n是正确的,同时对于n+1也正确。def tra (root,tar): if not root:return False ...
2022-03-30 17:11:23 251
原创 3.29leetcode146. LRU 缓存93. 复原 IP 地址114. 二叉树展开为链表
146. LRU 缓存class LRUCache: def __init__(self, capacity: int): self.dic={} self.queue=[] self.capacity=capacity def get(self, key: int) -> int: if key not in self.dic:return -1 else: self.
2022-03-29 13:10:53 378
原创 3.28leetcode105. 从前序与中序遍历序列构造二叉树54. 螺旋矩阵111. 二叉树的最小深度958. 二叉树的完全性检验331. 验证二叉树的前序序列化
105. 从前序与中序遍历序列构造二叉树class Solution: def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode: if not preorder:return def f(pre,mid): if pre and mid: root = pre[0] m..
2022-03-28 14:52:49 728
原创 3.27leetcode53. 最大子数组和121. 买卖股票的最佳时机21. 合并两个有序链表199. 二叉树的右视图82. 删除排序链表中的重复元素 II234. 回文链表215. 数组中的第K个
53. 最大子数组和dp:class Solution: def maxSubArray(self, nums: List[int]) -> int: if nums==[]:return llen = len(nums) dp = [0]*(llen) dp[0] = nums[0] for i in range(1,llen): if dp[i-1]<0:dp[i]=
2022-03-27 12:54:53 81
原创 3.26leetcode912. 排序数组143. 重排链表 1. 两数之和
912. 排序数组快速排序+随机选取,不加随机的话如果序列原本就是排好序的会超时class Solution: def sortArray(self, nums: List[int]) -> List[int]: def qsort(nums,l,r): if l<r: n = random.randint(l,r) nums[l],nums[n]=nums[n],nu.
2022-03-26 14:44:30 382
原创 3.25leetcode206. 反转链表160. 相交链表215. 数组中的第K个最大元素
206. 反转链表第一次ac的代码(递归):class Solution: def reverseList(self, head: ListNode) -> ListNode: if head == None:return None if not head.next:return head rear = head while rear.next: rear = rear.next
2022-03-25 15:12:27 1558
原创 3.24剑指56-1, 56-2, 15 -- 56数组中数字出现的次数15二进制中1的个数
^ 按位异或 ,二进制位数不同结果位为1 从十进制看表现为相等的数异或为 0,不等的数异或不为0 。注意:左移是a = a<<1,a<<1是错误的剑指 Offer 56 - I. 数组中数字出现的次数一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。class Solution: def singleNumbers(self, nums: L.
2022-03-24 17:00:49 297
原创 3.23剑指60, 46, 63 -- 60n个骰子的点数46把数字翻译成字符串63股票的最大利润
剑指 Offer 60. n个骰子的点数把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。class Solution: def dicesProbability(self, n: int) -> List[float]: if not n:return res =[[1/6,1/6,.
2022-03-23 16:27:05 286
原创 3.22剑指47, 48, 49 -- 47礼物的最大价值48最长不含重复字符的子字符串49丑数
剑指 Offer 49. 丑数我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。class Solution: def nthUglyNumber(self, n: int) -> int: if n==1:return 1 ug = [1] a,b,c = 0,0,0 while len(ug)<n: mincur = a
2022-03-22 14:10:24 111
原创 3.21剑指33, 34, 36
剑指 Offer 33. 二叉搜索树的后序遍历序列输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。class Solution: def verifyPostorder(self, postorder: List[int]) -> bool: def exam(L): if L:tmp = L.pop() else: ..
2022-03-21 17:50:27 259
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人