leetcode
一杯敬月光
这个作者很懒,什么都没留下…
展开
-
【leetcode 个人赛】秋叶收藏集 Python 解题思路
解题思路新建矩阵f[n][3]f[i][0] 为第i片叶子为’ryr’中的第一个r时,前面叶子一共需要的交换次数;f[i][1]为第i片叶子为’ryr’中的’y’时,前面叶子一共需要的交换次数;此时需考虑前面是y还是rf[i][2] 为第i片叶子为’ryr’中的第二个r时,前面叶子一共需要的交换次数;此时也需考虑前面是y还是r代码class Solution: def minimumOperations(self, leaves: str) -> int: n=le原创 2020-09-16 16:12:00 · 232 阅读 · 0 评论 -
【第195场周赛】前3题Python解题思路
mark一下,终于不是隔着时差半夜爬起来写周赛了,这次也是排名最好的一次,刚进300(不要嘲笑我)。题目1:5440. 数组异或操作class Solution: def xorOperation(self, n: int, start: int) -> int: nums=[0]*n for i in range(n): nums[i] = start + 2*i if n==1: retu原创 2020-06-21 16:19:31 · 240 阅读 · 0 评论 -
【leetcode 14. 最长公共前缀】Python解题思路
代码:class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: if not strs: return "" elif len(strs)==1: return strs[0] else: min_len=9999 for i in strs:原创 2020-06-15 03:46:49 · 210 阅读 · 0 评论 -
【leetcode 5425. 切割后面积最大的蛋糕】Python 解题思路
题目链接:解题思路:找到横切和竖切的最大间隔,然后相乘代码:class Solution: def maxArea(self, h: int, w: int, horizontalCuts: List[int], verticalCuts: List[int]) -> int: horizontalCuts.sort() verticalCuts.sort() n_hori=len(horizontalCuts) n_ve原创 2020-05-31 18:43:26 · 314 阅读 · 0 评论 -
【leetcode 5418. 二叉树中的伪回文路径】Python 解题思路
题目链接:解题思路:在dfs二叉树的路径到叶子节点时,需要判断路径中不同节点中个数为奇数的数字是否不超过1个。(得着重体会一下 进入递归之前的操作 -> cnt[root.val]+=1和走出递归之后的操作 -> cnt[root.val]-=1),去看dong哥的算法小抄。# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None)原创 2020-05-24 22:54:55 · 167 阅读 · 0 评论 -
【leetcode 5419. 两个子序列的最大点积】Python 解题思路
题目链接:解题思路:设置dp数组,dp[i][j]应该是 dp[i-1][j]、dp[i][j-1]、dp[i-1][j-1]、nums1[i]*nums2[j]、dp[i-1][j-1]+nums1[i]*nums2[j]之间的最大值。代码:class Solution: def maxDotProduct(self, nums1: List[int], nums2: List[int]) -> int: m=len(nums1) n=len(nums原创 2020-05-24 22:15:49 · 225 阅读 · 0 评论 -
【leetcode 5417. 定长子串中元音的最大数目】 Python 解题思路
题目链接:解题思路:用一个数组存储前面所有字符中元音的个数class Solution: def maxVowels(self, s: str, k: int) -> int: yuanyin=['a','e','i','o','u'] n=len(s) max_val=0 if k==1: for i in range(n): if s[i] in yuanyin:原创 2020-05-24 16:32:05 · 197 阅读 · 0 评论 -
【leetcode 1013. 将数组分成和相等的三个部分】Python 解题思路
题目链接:给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false。形式上,如果可以找出索引 i+1 < j 且满足 (A[0] + A[1] + … + A[i] == A[i+1] + A[i+2] + … + A[j-1] == A[j] + A[j-1] + … + A[A.length - 1]) 就可以将数组三等分。解题思路:while 循环遍历当前和是否为 全数组和的1/3,和为0的情况特殊考虑。class Solution:原创 2020-05-22 22:09:21 · 314 阅读 · 0 评论 -
【leetcode 1010. 总持续时间可被 60 整除的歌曲】Python 解题思路
题目链接:在歌曲列表中,第 i 首歌曲的持续时间为 time[i] 秒。返回其总持续时间(以秒为单位)可被 60 整除的歌曲对的数量。形式上,我们希望索引的数字 i 和 j 满足 i < j 且有 (time[i] + time[j]) % 60 == 0。解题思路:如果两个for循环则会超时;用dict存储歌曲时长%60,然后一个while循环或者两个指针访问,注意余数为0或者30的情况特殊处理。class Solution: def numPairsDivisibleBy6原创 2020-05-22 21:07:53 · 194 阅读 · 0 评论 -
【leetcode 1305. 两棵二叉搜索树中的所有元素】Python 解题思路
题目链接:给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。方法1:先序遍历(或者其他方式)+sort 排序# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = None原创 2020-05-20 23:54:44 · 164 阅读 · 0 评论 -
【leetcode 面试题 04.10. 检查子树】Python 解题思路
题目链接:检查子树。你有两棵非常大的二叉树:T1,有几万个节点;T2,有几万个节点。设计一个算法,判断 T2 是否为 T1 的子树。如果 T1 有这么一个节点 n,其子树与 T2 一模一样,则 T2 为 T1 的子树,也就是说,从节点 n 处把树砍断,得到的树与 T2 完全相同。解题思路:递归判断 - > 两棵树是否相同,如不同,t1的子树与t2是否相同# Definition for a binary tree node.# class TreeNode:# def __i原创 2020-05-20 22:35:12 · 131 阅读 · 0 评论 -
【leetcode 582. 杀死进程】Python 解题思路
题目链接:我们用两个序列来表示这些进程,第一个序列包含所有进程的 PID ,第二个序列包含所有进程对应的 PPID。现在给定这两个序列和一个 PID 表示你要杀死的进程,函数返回一个 PID 序列,表示因为杀这个进程而导致的所有被杀掉的进程的编号。当一个进程被杀掉的时候,它所有的孩子进程和后代进程都要被杀掉。你可以以任意顺序排列返回的 PID 序列。解题思路:用dict建立PPID - > PID 映射关系,用stack表示kill的当前进程的所有子进程class Solution:原创 2020-05-20 21:43:04 · 890 阅读 · 2 评论 -
【leetcode 1120. 子树的最大平均值】Python解题思路
题目链接:给你一棵二叉树的根节点 root,找出这棵树的 每一棵 子树的 平均值 中的 最大 值。子树是树中的任意节点和它的所有后代构成的集合。树的平均值是树中节点值的总和除以节点数。解题思路:设置nonlocal变量,自底向上->dfs返回当前节点为根节点的子树的节点和 and 节点数目# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.va原创 2020-05-20 17:12:57 · 1642 阅读 · 0 评论 -
【leetcode 563. 二叉树的坡度】Python 解题思路
题目链接:给定一个二叉树,计算整个树的坡度。一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。整个树的坡度就是其所有节点的坡度之和。解题思路:dfs函数 返回当前节点及其子节点的和,设置nonlocal变量在遍历节点的过程中累加 slopeclass Solution: def findTilt(self, root: TreeNode) -> int: slope=0 def dfs(root):原创 2020-05-20 07:06:19 · 186 阅读 · 0 评论 -
【leetcode 549. 二叉树中最长的连续序列】Python 解题思路
题目链接:给定一个二叉树,你需要找出二叉树中最长的连续序列路径的长度。请注意,该路径可以是递增的或者是递减。例如,[1,2,3,4] 和 [4,3,2,1] 都被认为是合法的,而路径 [1,2,4,3] 则不合法。另一方面,路径可以是 子-父-子 顺序,并不一定是 父-子 顺序。解题思路:自底向上->判断当前节点是否能延续其子节点所能构成的递增序列和递减序列,注意:当前节点若不能延续其子节点所形成的递增或递减序列时,需将相应的inc/desc变量赋值为1!!!(卡在这里半小时,好伤)树的遍原创 2020-05-20 06:46:25 · 670 阅读 · 0 评论 -
【leetcode 1371. 每个元音包含偶数次的最长子字符串】Python解题思路
题目链接给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:每个元音字母,即 ‘a’,‘e’,‘i’,‘o’,‘u’ ,在子字符串中都恰好出现了偶数次。参照官方题解写的python代码class Solution: def findTheLongestSubstring(self, s: str) -> int: location=[-1]*32 #保存各个状态最早出现位置 n=len(s) status=0原创 2020-05-20 04:17:45 · 407 阅读 · 0 评论 -
【leetcode 1022. 从根到叶的二进制数之和】Python 解题思路
给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。以 10^9 + 7 为模,返回这些数字之和。题目链接:开心,又实践了一下nonlocal的用法,对于二进制数的操作还是得锻炼熟悉,对于二叉树的递归操作还得加深理解,不然用的时候什么也想不起来.原创 2020-05-20 02:49:41 · 190 阅读 · 0 评论 -
【leetcode 第26场双周赛】前3题 Python解题思路
题不难也只能三题的选手在此。。打算刷题过程中遇到hard连题解都看着费劲的时候就pass。。题目1 (5396. 连续字符):给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。请你返回字符串的能量。示例1:输入:s = “leetcode” 输出:2解题思路:保存上一个遍历的字符及其连续长度class Solution: def maxPower(self, s: str) -> int: if len(s)==1:原创 2020-05-17 02:40:31 · 416 阅读 · 0 评论 -
【leetcode 面试题 08.10. 颜色填充】Python解题思路
颜色填充。编写函数,实现许多图片编辑软件都支持的“颜色填充”功能。给定一个屏幕(以二维数组表示,元素为颜色值)、一个点和一个新的颜色值,将新颜色值填入这个点的周围区域,直到原来的颜色值全都改变。解题思路:从指定点出发dfs,改变值,记录访问状态class Solution: def floodFill(self, image: List[List[int]], sr: int, sc: int, newColor: int) -> List[List[int]]: de.原创 2020-05-16 18:11:06 · 233 阅读 · 0 评论 -
【leetcode 533. 孤独像素 II】Python 解题思路
给定一幅由黑色像素和白色像素组成的图像, 与一个正整数N, 找到位于某行 R 和某列 C 中且符合下列规则的黑色像素的数量:1 行R 和列C都恰好包括N个黑色像素。2 列C中所有黑色像素所在的行必须和行R完全相同。图像由一个由‘B’和‘W’组成二维字符数组表示, ‘B’和‘W’分别代表黑色像素和白色像素。讲真,题目中的第二个条件我也是看了好几遍才看懂(语文该重学了),第二个条件是说 列C中所有黑色像素所在的行 (可能有很多行),这些行都和行R完全一致。感觉自己对算法和数据结构的理解还是太欠缺了.原创 2020-05-16 06:12:20 · 426 阅读 · 0 评论 -
【leetcode 531. 孤独像素 I】Python 解题思路
暴力解法,没有剪枝,为何还能超过90%的提交呢?大概是大家主要还是C++刷题吧。。本来想尝试剪枝,就是已经有B的行和列在遍历过程中记录,防止下次遍历时重复判断,但。。bug了,想着暴力直接提交看能不能过,竟然过了。。看了下题解:官方给的暴力解法是如果一个元素是黑色,那继续判断其所在行列是否黑色元素数都为1,时间复杂度 O(mn*(m+n));官方给的预处理方法思路是 先计算每行和每列的黑色元素数,此步骤O(mn)时间复杂度,但之后判断孤独元素只需O(1)时间复杂度。class Solution:原创 2020-05-16 05:41:04 · 330 阅读 · 0 评论 -
【leetcode 面试题 04.05. 合法二叉搜索树】python解题思路
题目:实现一个函数,检查一棵二叉树是否为二叉搜索树。解题思路:中序遍历后检查是否是递增序列,是因为用python的人少吗?内存和时间还能击败好大百分比用户呢?# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Soluti原创 2020-05-15 22:47:35 · 191 阅读 · 0 评论 -
【leetcode130 被围绕的区域】python解题思路
给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。解题思路:处理与边界’O’相邻的’O’,最后再把内部的’O’替换为’X’。class Solution: def solve(self, board: List[List[str]]) -> None: """ Do not return anything, modify board in-place instead.原创 2020-05-15 16:32:12 · 264 阅读 · 0 评论 -
【leetcode 1389. 按既定顺序创建目标数组】 Python 解题思路
class Solution: def createTargetArray(self, nums: List[int], index: List[int]) -> List[int]: ll=[] if len(nums)==1: ll.append(nums[0]) else: ll.append(nums[0]) for i in range(1,len(index)):原创 2020-05-15 16:00:27 · 162 阅读 · 0 评论 -
【leetcode 1375. 灯泡开关 III】python 解题思路
题目链接之前先尝试了亮灯编号和,结果在第61/63案例处TLE,尝试判断最大亮灯编号和亮灯个数是否相等,通过。class Solution: def numTimesAllBlue(self, light: List[int]) -> int: ans=0 sub_max=-1 for k in range(len(light)): sub_max=max(sub_max,light[k]) i原创 2020-05-15 15:57:15 · 193 阅读 · 0 评论 -
【leetcode 1377. T 秒后青蛙的位置】python 解题思路
解题思路:自底向上找到从target到起始节点的路径,根据target节点是否有子节点来判断青蛙是在target原地跳还是跳到别的节点。class Solution: def frogPosition(self, n: int, edges: List[List[int]], t: int, target: int) -> float: dict1=defaultdict(list) if not edges: ans=1原创 2020-05-15 15:53:41 · 164 阅读 · 0 评论 -
【leetcode 560 和为K的子数组】python 解题思路
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。思路:前缀和加哈希表class Solution: def subarraySum(self, nums: List[int], k: int) -> int: count=0 prefix_sum=0 dict1={} dict1[0]=1 for i in range(len(nums)): pre.原创 2020-05-15 15:45:00 · 157 阅读 · 0 评论 -
【leetcode】5407切披萨 Python 题解
周赛题目一难,就从3题选手变为2题选手。总之,得认真刷题。第四题题目链接:切披萨参考了一位大神的题解,理解了大神的思路和C++代码后,用python写了一遍,为了便于自己理解,有些地方略啰嗦。1.dp数组的含义dp [i] [j] [k] 表示当前剩余披萨左上角坐标为(i,j)时披萨可被切为k块的方案数水平切:dp [i] [j] [k]+=dp [i-1] [j] [k-1]垂直切:dp [i] [j] [k]+=dp [i] [j-1] [k-1]2.判断上述切割动作是否符合 切出的披原创 2020-05-11 04:40:58 · 1230 阅读 · 0 评论