leetcode
柒年时光
越自律越自由
展开
-
【数位DP】leetcode2376. 统计特殊整数
数位DP原创 2023-03-20 15:25:35 · 401 阅读 · 1 评论 -
【二叉树】leetcode687.最长同值路径
给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值。这条路径可以经过也可以不经过根节点。两个节点之间的路径长度 由它们之间的边数表示。原创 2023-03-17 11:40:12 · 150 阅读 · 0 评论 -
leetcode1617.统计子树中城市之间最大距离
树的直径原创 2023-03-13 15:06:46 · 237 阅读 · 0 评论 -
【week307-amazon】leetcode2384. 最大回文数字
周赛原创 2022-08-22 16:46:47 · 555 阅读 · 0 评论 -
【week307-amazon】leetcode2386. 找出数组的第 K 大和
周赛原创 2022-08-22 16:07:47 · 346 阅读 · 0 评论 -
【week307-amazon】leetcode6154. 感染二叉树需要的总时间
周赛原创 2022-08-22 16:03:54 · 208 阅读 · 0 评论 -
【week307-amazon】leetcode2383/6152.赢得比赛需要的最少训练时长
周赛原创 2022-08-22 15:59:03 · 995 阅读 · 0 评论 -
【网格问题】【并查集】leetcode 305.岛屿数量 II
网格问题,并查集原创 2022-08-19 17:02:46 · 790 阅读 · 0 评论 -
【网格问题】leetcode1254.统计封闭岛屿的数目
网格问题原创 2022-08-19 11:36:02 · 202 阅读 · 0 评论 -
【网格问题】leetcode694.不同岛屿的数量
网格问题原创 2022-08-19 09:56:19 · 320 阅读 · 0 评论 -
leetcode556 下一个更大元素 III
下一个更大元素原创 2022-08-03 11:29:51 · 121 阅读 · 0 评论 -
【递归】leetcode25. K 个一组翻转链表
递归,链表翻转原创 2022-07-28 09:08:46 · 138 阅读 · 0 评论 -
【动态规划】leetcode926.将字符串翻转到单调递增
动态规划原创 2022-06-11 10:31:55 · 147 阅读 · 0 评论 -
【二叉树】【DFS】leetcode2049.统计最高分的节点数目
题目:给你一棵根节点为 0 的 二叉树 ,它总共有 n 个节点,节点编号为 0 到 n - 1 。同时给你一个下标从 0 开始的整数数组 parents 表示这棵树,其中 parents[i] 是节点 i 的父节点。由于节点 0 是根,所以 parents[0] == -1 。一个子树的 大小 为这个子树内节点的数目。每个节点都有一个与之关联的 分数 。求出某个节点分数的方法是,将这个节点和与它相连的边全部 删除 ,剩余部分是若干个 非空 子树,这个节点的 分数 为所有这些子树 大小的乘积 。请你返回原创 2022-03-11 21:08:13 · 327 阅读 · 0 评论 -
【前缀和】leetcode2055.蜡烛之间的盘子
题目:给你一个长桌子,桌子上盘子和蜡烛排成一列。给你一个下标从 0 开始的字符串 s ,它只包含字符 ‘’ 和 ‘|’ ,其中 '’ 表示一个 盘子 ,’|’ 表示一支 蜡烛 。同时给你一个下标从 0 开始的二维整数数组 queries ,其中 queries[i] = [lefti, righti] 表示 子字符串 s[lefti…righti] (包含左右端点的字符)。对于每个查询,你需要找到 子字符串中 在 两支蜡烛之间 的盘子的 数目 。如果一个盘子在 子字符串中 左边和右边 都 至少有一支蜡烛原创 2022-03-08 15:44:17 · 206 阅读 · 0 评论 -
【前缀和】leetcode2100.适合打劫银行的日子
题目:你和一群强盗准备打劫银行。给你一个下标从 0 开始的整数数组 security ,其中 security[i] 是第 i 天执勤警卫的数量。日子从 0 开始编号。同时给你一个整数 time 。如果第 i 天满足以下所有条件,我们称它为一个适合打劫银行的日子:第 i 天前和后都分别至少有 time 天。第 i 天前连续 time 天警卫数目都是非递增的。第 i 天后连续 time 天警卫数目都是非递减的。更正式的,第 i 天是一个合适打劫银行的日子当且仅当:security[i - ti原创 2022-03-06 12:07:37 · 115 阅读 · 0 评论 -
leetcode564.寻找最近的回文数
题目:给定一个表示整数的字符串 n ,返回与它最近的回文整数(不包括自身)。如果不止一个,返回较小的那个。“最近的”定义为两个整数差的绝对值最小。思路:情形一:本身已经是回文数,最近的两个回文数与其距离相等,返回较小的一个,如99299返回min(99199,99399)=99199情形二:本身不是回文数,对后一半数修改后可变成回文数:构造的回文整数大于原数时,我们可以减小该回文整数的中间部分来缩小回文整数和原数的差距,如99321修改后一半后对应的回文数为99399,可调整中间部分将其变为原创 2022-03-02 14:47:55 · 647 阅读 · 0 评论 -
【二叉树】【层序遍历】leetcode314.二叉树的垂直遍历
题目:给你一个二叉树的根结点,返回其结点按 垂直方向(从上到下,逐列)遍历的结果。如果两个结点在同一行和列,那么顺序则为 从左到右。解答:# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.r原创 2022-02-25 14:29:13 · 466 阅读 · 0 评论 -
【二叉树】【回溯】leetcode95.不同的二叉搜索树II
题目:给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。解答:# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# sel原创 2022-02-25 14:03:39 · 120 阅读 · 0 评论 -
【二叉树】leetcode662.二叉树最大宽度
题目:给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。思路:为树的每个节点进行编号,根节点从1开始编号若当前节点的编号为i,则其左孩子节点的编号为2i,其右孩子节点的编号为2i+1对二叉树进行层序遍历,更新res=max(res,每层最后一个节点的编号-每层第一个节点的编号原创 2022-02-25 13:27:05 · 116 阅读 · 0 评论 -
【网格问题】【优先级队列】leetcode499.迷宫III
题目:由空地和墙组成的迷宫中有一个球。球可以向上(u)下(d)左(l)右(r)四个方向滚动,但在遇到墙壁前不会停止滚动。当球停下时,可以选择下一个方向。迷宫中还有一个洞,当球运动经过洞时,就会掉进洞里。给定球的起始位置,目的地和迷宫,找出让球以最短距离掉进洞里的路径。 距离的定义是球从起始位置(不包括)到目的地(包括)经过的空地个数。通过’u’, ‘d’, ‘l’ 和 'r’输出球的移动方向。 由于可能有多条最短路径, 请输出字典序最小的路径。如果球无法进入洞,输出"impossible"。迷宫由一个原创 2022-02-24 14:57:48 · 456 阅读 · 0 评论 -
【网格问题】leetcode490.迷宫
题目:由空地(用 0 表示)和墙(用 1 表示)组成的迷宫 maze 中有一个球。球可以途经空地向 上、下、左、右 四个方向滚动,且在遇到墙壁前不会停止滚动。当球停下时,可以选择向下一个方向滚动。给你一个大小为 m x n 的迷宫 maze ,以及球的初始位置 start 和目的地 destination ,其中 start = [startrow, startcol] 且 destination = [destinationrow, destinationcol] 。请你判断球能否在目的地停下:如果可原创 2022-02-24 13:53:17 · 676 阅读 · 0 评论 -
【网格问题】leetcode505.迷宫II
题目:由空地和墙组成的迷宫中有一个球。球可以向上下左右四个方向滚动,但在遇到墙壁前不会停止滚动。当球停下时,可以选择下一个方向。给定球的起始位置,目的地和迷宫,找出让球停在目的地的最短距离。距离的定义是球从起始位置(不包括)到目的地(包括)经过的空地个数。如果球无法停在目的地,返回 -1。迷宫由一个0和1的二维数组表示。 1表示墙壁,0表示空地。你可以假定迷宫的边缘都是墙壁。起始位置和目的地的坐标通过行号和列号给出。解答:class Solution: def shortestD原创 2022-02-24 13:28:16 · 752 阅读 · 0 评论 -
【状态DP】leetcode1994.好子集的数目
题目:给你一个整数数组 nums 。如果 nums 的一个子集中,所有元素的乘积可以表示为一个或多个 互不相同的质数 的乘积,那么我们称它为 好子集 。比方说,如果 nums = [1, 2, 3, 4] :[2, 3] ,[1, 2, 3] 和 [1, 3] 是 好 子集,乘积分别为 6 = 23 ,6 = 23 和 3 = 3 。[1, 4] 和 [4] 不是 好 子集,因为乘积分别为 4 = 22 和 4 = 22 。请你返回 nums 中不同的 好 子集的数目对 109 + 7 取余 的结原创 2022-02-22 14:59:01 · 626 阅读 · 0 评论 -
【滑动窗口】leetcode838.推多米诺
题目:n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,同时把一些多米诺骨牌向左或向右推。每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。如果一张垂直竖立的多米诺骨牌的两侧同时有多米诺骨牌倒下时,由于受力平衡, 该骨牌仍然保持不变。就这个问题而言,我们会认为一张正在倒下的多米诺骨牌不会对其它正在倒下或已经倒下的多米诺骨牌施加额外的力。给你一个字符串 dominoes 表示这一行多米诺骨牌的初始状态,其中:原创 2022-02-22 13:14:09 · 168 阅读 · 0 评论 -
【排序】leetcode969. 煎饼排序
题目:给你一个整数数组 arr ,请使用 煎饼翻转 完成对数组的排序。一次煎饼翻转的执行过程如下:选择一个整数 k ,1 <= k <= arr.length反转子数组 arr[0…k-1](下标从 0 开始)例如,arr = [3,2,1,4] ,选择 k = 3 进行一次煎饼翻转,反转子数组 [3,2,1] ,得到 arr = [1,2,3,4] 。以数组形式返回能使 arr 有序的煎饼翻转操作所对应的 k 值序列。任何将数组排序且翻转次数在 10 * arr.length原创 2022-02-19 14:49:27 · 364 阅读 · 0 评论 -
【滑动窗口】leetcode340.至多包含 K 个不同字符的最长子串
题目:给定一个字符串 s ,找出 至多 包含 k 个不同字符的最长子串 T。思路:需要使用一个字典来记录当前滑动窗口中的字符及其最后一次出现的位置,方便后续窗口的移动。解答:class Solution: def lengthOfLongestSubstringKDistinct(self, s: str, k: int) -> int: #滑动窗口 n=len(s) if n==0 or k==0: retu原创 2022-02-18 16:49:24 · 280 阅读 · 0 评论 -
leetcode277.搜寻名人
题目:假设你是一个专业的狗仔,参加了一个 n 人派对,其中每个人被从 0 到 n - 1 标号。在这个派对人群当中可能存在一位 “名人”。所谓 “名人” 的定义是:其他所有 n - 1 个人都认识他/她,而他/她并不认识其他任何人。现在你想要确认这个 “名人” 是谁,或者确定这里没有 “名人”。而你唯一能做的就是问诸如 “A 你好呀,请问你认不认识 B呀?” 的问题,以确定 A 是否认识 B。你需要在(渐近意义上)尽可能少的问题内来确定这位 “名人” 是谁(或者确定这里没有 “名人”)。在本题中,你可原创 2022-02-18 16:10:59 · 669 阅读 · 0 评论 -
【堆】leetcode253.会议室II
题目:给你一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,返回 所需会议室的最小数量 。思路:开始时,按会议开始时间进行排序(先开始的会议需要先安排)。需要使用小根堆,来记录当前会议的最早结束时间(以判别当前是否有空闲会议室可用)解答:class Solution: def minMeetingRooms(self, intervals: List[List[int]]) -> in原创 2022-02-17 22:00:14 · 288 阅读 · 0 评论 -
【位运算】leetcode260.只出现一次的数字
题目:给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?思路:利用异或的性质(同为0,异为1),将两个数分别置于两类中。解答:时间复杂度:O(n)空间复杂度:O(1)class Solution: def singleNumber(self, nums: List[int]) -> List[int]:原创 2022-02-17 17:23:53 · 202 阅读 · 0 评论 -
leetcode1719.重构一棵树的方案数
题目:给你一个数组 pairs ,其中 pairs[i] = [xi, yi] ,并且满足:pairs 中没有重复元素xi < yi令 ways 为满足下面条件的有根树的方案数:树所包含的所有节点值都在 pairs 中。一个数对 [xi, yi] 出现在 pairs 中 当且仅当 xi 是 yi 的祖先或者 yi 是 xi 的祖先。注意:构造出来的树不一定是二叉树。两棵树被视为不同的方案当存在至少一个节点在两棵树中有不同的父节点。请你返回:如果 ways == 0 ,返回原创 2022-02-16 15:40:20 · 287 阅读 · 0 评论 -
【网格问题】【DFS】【记忆化搜索】leetcode329. 矩阵中的最长递增路径
题目:给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。解答:方法一:超出时间限制class Solution: def longestIncreasingPath(self, matrix: List[List[int]]) -> int: directions=[[-1,0],[1,0],[0,-1],[0,1原创 2022-02-15 13:30:00 · 235 阅读 · 0 评论 -
【动态规划】leetcode44.通配符匹配
题目:给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。‘?’ 可以匹配任何单个字符。‘*’ 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。解答:class Solution: def isMatch(self, s: str, p: str) -> bool: #原创 2022-02-14 21:09:26 · 218 阅读 · 0 评论 -
leetcode41.缺失的第一个正整数
题目:给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。解答:class Solution: def firstMissingPositive(self, nums: List[int]) -> int: #答案位于[1,n+1]之间,若[1,n]都在数组中,则答案为n+1;否则答案位于[1,n]之间 n=len(nums) #将负数变为n+1原创 2022-02-14 17:50:46 · 339 阅读 · 0 评论 -
【树状数组】单点更新和前缀和查询
原创 2022-02-14 15:31:28 · 230 阅读 · 0 评论 -
【树状数组】leetcode315.计算右侧小于当前元素的个数
题目:给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。思路:树状数组用于解决【前缀和查询】与【单点更新】问题解答:from typing import Listclass Solution: def countSmaller(self, nums: List[int]) -> List[int]: class FenwickTr原创 2022-02-13 17:38:35 · 429 阅读 · 0 评论 -
leetcode29.两数相除
题目:给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2思路:a = b * 2^(i1) + b * 2^(i2) + … + c (c < b)= b * (2 ^ i1 + 2 ^ i2 + …) +原创 2022-02-13 15:22:58 · 478 阅读 · 0 评论 -
【快速幂】leetcode50.Pow(x,n)
题目:实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,x^n )。思路:参考官方题解解答:class Solution: def myPow(self, x: float, n: int) -> float: if x == 0.0: return 0.0 res = 1 if n < 0: x, n = 1 / x, -n while n:原创 2022-02-12 22:29:18 · 298 阅读 · 0 评论 -
【桶排序】leetcode324.摆动排序II
题目:给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。你可以假设所有输入数组都可以得到满足题目要求的结果。解答:class Solution: def wiggleSort(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead.原创 2022-02-12 22:04:38 · 198 阅读 · 0 评论 -
【网格问题】leetcode1020.飞地的数量
题目:给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。解答:方法一:BFSclass Solution: def numEnclaves(self, grid: List[List[int]]) -> int: #BFS原创 2022-02-12 15:55:48 · 343 阅读 · 0 评论