自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(102)
  • 收藏
  • 关注

原创 leetcode 406. 根据身高重建队列

因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]输入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]输出:[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]题目数据确保队列可以被重建。

2023-11-07 13:35:44 119

原创 leetcode 684. 冗余连接

给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。实现,记录每个节点的对用的最终 parent 节点,加入一条边为 (a, b), 则赋值 a 的 parent 节点为 b 的 parent 节点, 如果一条边的 parent 对应节点相同,那么说明这俩节点已经在 图中了。输入: edges = [[1,2], [2,3], [3,4], [1,4], [1,5]]输入: edges = [[1,2], [1,3], [2,3]]树可以看成是一个连通且 无环 的 无向 图。

2023-11-05 15:04:17 535

原创 leetcode 124. 二叉树中的最大路径和

二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。思路,可以通过一个函数,求以 root 为 根节点到 子节点的最大 pathSum, 这样递归遍历就能求出所有的 pathSum。解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42。解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6。输入:root = [-10,9,20,null,null,15,7]输入:root = [1,2,3]

2023-10-30 19:27:54 290

原创 leetcode 1353. 最多可以参加的会议数目

给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi。你可以在满足 startDayi

2023-10-29 19:44:16 206

原创 leetcode 29. 两数相除

注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1;如果商 严格小于 -231 ,则返回 -231。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2。32 + 3*1 +1 (其中 32 = 2^5, 1 也类似)。输入: dividend = 10, divisor = 3。输入: dividend = 7, divisor = -3。

2023-10-26 22:11:27 235

原创 leetcode 460. LFU 缓存

cache 中的元素仍然是一个双向链表,除此之外,还需要维护一个变量,统计当前cache 中的元素的最小出现次数(从cache 中删除元素时,需要根据这个值来进行删除)当一个键首次插入到缓存中时,它的使用计数器被设置为 1 (由于 put 操作)。// 去除键 1 ,1 和 3 的 cnt 相同,但 1 最久未使用。int get(int key) - 如果键 key 存在于缓存中,则获取键的值,否则返回 -1。// 去除键 2 ,因为 cnt(2)=1 ,使用计数最小。lfu.get(1);

2023-10-22 16:05:39 601 1

原创 leetcode 310 最小高度树

思路1, 先根据图的叶子节点(对应的边为1),进行广度遍历,遍历到最后一层,则显然以最后一层为根节点的树是最小高度树。输入:n = 6, edges = [[3,0],[3,1],[3,2],[3,4],[5,4]]解释:如图所示,当根是标签为 1 的节点时,树的高度是 1 ,这是唯一的最小高度树。输入:n = 4, edges = [[1,0],[1,2],[1,3]]x 到 y 之间的路径即为图中的最长路径,找到路径的中间节点即为根节点。树的 高度 是指根节点和叶子节点之间最长向下路径上边的数量。

2023-10-21 17:06:33 221

原创 leetcode 37. 解数独

数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。数独部分空格内已填入了数字,空白格用 ‘.’ 表示。board[i][j] 是一位数字或者 ‘.’编写一个程序,通过填充空格来解决数独问题。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。题目数据 保证 输入数独仅有一个解。

2023-10-20 10:08:55 220

原创 leetcode 502. IPO

总而言之,从给定项目中选择 最多 k 个不同项目的列表,以 最大化最终资本 ,并输出最终可获得的最多资本。输入:k = 2, w = 0, profits = [1,2,3], capital = [0,1,1]输入:k = 3, w = 0, profits = [1,2,3], capital = [0,1,2]当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。由于你最多可以选择两个项目,所以你需要完成 2 号项目以获得最大的资本。在完成后,你将获得 1 的利润,你的总资本将变为 1。

2023-10-09 09:40:36 115

原创 leetcode 96 不同的二叉搜索树

输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树。可以按 任意顺序 返回答案。给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。leetcode 95 输出最后重建的二叉树,思路,可以用动态规划的思路来做。

2023-10-08 20:43:59 209

原创 leetcode 886. 可能的二分法

否则返回 false。思路:用「染色法」来解决,第一组颜色标记为 1, 则相邻组的颜色标记为 2,遍历时,如果发现邻节点已经被染色,且和当前节点的颜色相同,说明是不能划分为两组的。输入:n = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]]输入:n = 4, dislikes = [[1,2],[1,3],[2,4]]输入:n = 3, dislikes = [[1,2],[1,3],[2,3]]解释:group1 [1,4], group2 [2,3]

2023-10-06 23:23:35 204

原创 leetcode之打家劫舍

同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。思路,对于打家劫舍 I, 可以转化成动态规划问题求解,对于打家劫舍 II ,首尾认为是相邻,可以转换成调用 打家劫舍 I 中的问题两次,解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。输入:nums = [1,2,3,1]输入:nums = [1,2,3]

2023-09-30 14:57:56 161

原创 leetcode 135. 分发糖果

思路,可以采用贪心法,从左往右遍历,默认是1,如果 ratings[i] > ratings[i-1], 则右边的数等于左边数加+, 同理,再从右往左遍历一次。解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目。第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。输入:ratings = [1,0,2]输入:ratings = [1,2,2]

2023-09-20 09:16:17 209

原创 leetcode 133. 克隆图

由于图是无向的,如果节点 p 是节点 q 的邻居,那么节点 q 也必须是节点 p 的邻居。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。每个列表都描述了图中节点的邻居集。输入:adjList = [[2,4],[1,3],[2,4],[1,3]]输出:[[2,4],[1,3],[2,4],[1,3]]节点 1 的值是 1,它有两个邻居:节点 2 和 4。节点 2 的值是 2,它有两个邻居:节点 1 和 3。节点 4 的值是 4,它有两个邻居:节点 1 和 3。

2023-09-20 09:06:35 226

原创 leetcode 1562. 查找大小为 M 的最新分组

步骤 3:“10101”,由 1 构成的组:[“1”, “1”, “1”]步骤 3:“10101”,由 1 构成的组:[“1”, “1”, “1”]步骤 4:“11101”,由 1 构成的组:[“111”, “1”]步骤 4:“10111”,由 1 构成的组:[“1”, “111”]步骤 2:“00101”,由 1 构成的组:[“1”, “1”]步骤 2:“10100”,由 1 构成的组:[“1”, “1”]步骤 1:“00100”,由 1 构成的组:[“1”]输入:arr = [1], m = 1。

2023-09-17 22:32:53 162

原创 leetcode 123. 买卖股票的最佳时机 III

解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3。解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3。输入:prices = [3,3,5,0,0,3,1,4]输入:prices = [1]

2023-09-17 21:27:49 70

原创 leetcode 2602. 使数组元素全部相等的最少操作次数

思路:可以用前缀和来减少计算, 如下图,先把 nums 从小到大排序,查找每个 query 在 nums 中的 index, index 左边的每个数都小于 query, index 右边的每个数都大于 query, 则 左边和就是 index*query - curSum[index], 右边也同理,这样代码就很容易写出来了。输入:nums = [3,1,6,8], queries = [1,5]输入:nums = [2,9,6,3], queries = [10]输出:[14,10]

2023-09-16 09:57:22 328

原创 leetcode 97. 交错字符串

交错 是 s1 + t1 + s2 + t2 + s3 + t3 + …或者 t1 + s1 + t2 + s2 + t3 + s3 + …输入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”输入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。输入:s1 = “”, s2 = “”, s3 = “”

2023-09-09 10:03:04 338

原创 leetcode 137. 只出现一次的数字 II

思路,每个数都是 32 bit, 统计每个 bit 所有数在该 bit 位 1个个数,设该值为 sum, 若 sum%3!= 0, 说明仅出现一次的元素的该 bit 为 1, 循环 32次就能计算出来了。给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次。请你找出并返回那个只出现了一次的元素。nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次。输入:nums = [0,1,0,1,0,1,99]输入:nums = [2,2,3,2]

2023-09-08 23:22:46 371

原创 leetcode 416. 分割等和子集

显然 dp[i][j] = dp[i-1][j] or (dp[i-1][j-nums[i]] if j>=nums[i] else 0),时间复杂度为 O(n*sum(nums)/2)思路:定义 dp[i][j] 表示从 nums 中前 i 个元素挑选若干个数,是否存在和为 j 的可能, dp[i][0] = 1。解释:数组可以分割成 [1, 5, 5] 和 [11]。解释:数组不能分割成两个元素和相等的子集。输入:nums = [1,5,11,5]输入:nums = [1,2,3,5]

2023-08-04 22:44:42 314

原创 leetcode 152. 乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。思路: 用 g[i] 表示以第 i 个元素结尾的最大连续乘积,s[i] 表示以第 i 个元素结尾的最小连续乘积。则 g[i] = max(nums[i], g[i-1]*nums[i], s[i-1]*nums[i])解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。输入: nums = [2,3,-2,4]输入: nums = [-2,0,-1]

2023-08-04 22:35:58 301

原创 leetcode 983. 最低票价

思路,定义 dp[i] 为到第 i 天的最小 cost,则有,如果 i 不在 days 里面 dp[i] = dp[i-1], 如果 i 在 days 里面 dp[i] = min(dp[i-1]+costs[0], dp[i-7]+costs[1], dp[i-30]+costs[30])输入:days = [1,2,3,4,5,6,7,8,9,10,30,31], costs = [2,7,15]在第 1 天,你花了 costs[0] = $2 买了一张为期 1 天的通行证,它将在第 1 天生效。

2023-08-03 21:21:23 604

原创 leetcode 827. 最大人工岛

(用一个数组保存矩阵的每个位置到属于某个岛屿的映射,一个map 保存岛屿的面积)。然后再遍历矩阵,碰到0,就判断其上下左右,如果不是一个岛屿,就把他们的面积相加。解释: 将一格0变成1,最终连通两个小岛得到面积为 3 的岛屿。输入: grid = [[1, 0], [0, 1]]输入: grid = [[1, 1], [1, 0]]输入: grid = [[1, 1], [1, 1]]解释: 没有0可以让我们变成1,面积依然为 4。解释: 将一格0变成1,岛屿的面积扩大为 4。思路:先遍历一遍矩阵,

2023-08-03 08:24:31 234

原创 leetcode 1372. 二叉树中的最长交错路径

temp 节点为终结点(temp 节点是父节点的右子节点)的最长交错路径为 r_temp, 显然,如果 temp1为 temp 的左子节点,l_temp1 = r_temp + 1, 如果是右子节点, r_temp1 = l_temp1 + 1。输入:root = [1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]输入:root = [1,1,1,null,1,null,null,1,1,null,1]输入:root = [1]

2023-07-30 09:28:08 242

原创 leetcode 560. 和为 K 的子数组

思路:用一个 字典 a 记录从初始位置到当前位置的前缀和(prev),则以 i 结尾的连续子数组的和为 k 的个数是 a[prev-k], 注意,初始化 a[0]=1。给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数。输入:nums = [1,1,1], k = 2。输入:nums = [1,2,3], k = 3。

2023-07-29 09:22:03 315

原创 leetcode 41. 缺失的第一个正数

思路1,如果是在 [1,n] 范围内,就交换到对应的位置,时间复杂度为 O(n)给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。输入:nums = [7,8,9,11,12]输入:nums = [3,4,-1,1]输入:nums = [1,2,0]

2023-07-27 23:21:22 287

原创 leetcode 2542. 最大子序列的分数

思路,可以把 nums1 和 nums2 组合到一起后按 nums2 从大到小排序,先用最小值堆如堆 k个元素,因为往右 nums2[i] 会逐渐变小,故只有 nums1[i] 大于堆顶元素(sum会变大),结果才可能变大。用公示表示: (nums1[i0] + nums1[i1] +…输入:nums1 = [4,2,3,1,1], nums2 = [7,5,10,9,6], k = 1。输入:nums1 = [1,3,3,2], nums2 = [2,1,3,4], k = 3。

2023-07-23 23:18:41 208

原创 leetcode 72. 编辑距离

其中 dp[i-1][j-1] 表示 替换操作, dp[i-1][j] 和 dp[i][j-1] 表示插入删除操作。思路:另 dp[i][j] 表示 word1 的前 i 个字符与 word2 的前 j 个字符的编辑距离,显然,当 word1[i] == word2[j] 时,dp[i][j] = dp[i-1][j-1]inention -> enention (将 ‘i’ 替换为 ‘e’)horse -> rorse (将 ‘h’ 替换为 ‘r’)rose -> ros (删除 ‘e’)

2023-07-23 22:24:19 272

原创 leetcode 399. 除法求值

输入:equations = [[“a”,“b”],[“b”,“c”],[“bc”,“cd”]], values = [1.5,2.5,5.0], queries = [[“a”,“c”],[“c”,“b”],[“bc”,“cd”],[“cd”,“bc”]]输入:equations = [[“a”,“b”],[“b”,“c”]], values = [2.0,3.0], queries = [[“a”,“c”],[“b”,“a”],[“a”,“e”],[“a”,“a”],[“x”,“x”]]

2023-07-23 20:49:21 163

原创 leetcode 649. Dota2 参议院

然后,如果有 n 个参议员,给定字符串的大小将是 n。宣布胜利:如果参议员发现有权利投票的参议员都是 同一个阵营的 ,他可以宣布胜利并决定在游戏中的有关变化。第 1 轮时,第一个来自 Radiant 阵营的参议员可以使用第一项权利禁止第二个参议员的权利。这一轮中,第三个来自 Dire 阵营的参议员可以使用他的第一项权利禁止第一个参议员的权利。禁止一名参议员的权利:参议员可以让另一位参议员在这一轮和随后的几轮中丧失 所有的权利。这一轮中,第二个来自 Dire 阵营的参议员会将被跳过,因为他的权利被禁止了。

2023-07-22 21:02:22 135

原创 leetcode 17.24. 最大子矩阵

其实最暴力的算法,矩阵内元素相加是可以做一些优化的,比如当前已经计算好了 (r1, c1) 开头,(r2, c2) 结束的子矩阵的和,那我们计算 (r1, c1) 开头,(r2, c2+1) 的时候就不用完全重新计算了。返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。思路:直接用最暴力的算法,计算 (i,j) 为 开头的节点的最大矩阵(m 行 n 列),这样时间复杂度是 m。输出:[0,1,0,1]

2023-07-19 09:14:35 266

原创 leetcode 334. 递增的三元子序列

如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true;解释:三元组 (3, 4, 5) 满足题意,因为 nums[3] == 0 < nums[4] == 4 < nums[5] == 6。进阶:你能实现时间复杂度为 O(n) ,空间复杂度为 O(1) 的解决方案吗?输入:nums = [2,1,5,0,4,6]输入:nums = [1,2,3,4,5]输入:nums = [5,4,3,2,1]

2023-07-18 10:07:29 279

原创 leetcode 630. 课程表 III

2.根据1,我们可以把课程根据 lastDay 从小到大排序,当遍历到 (ti,di) 课程时,如果学 ti 课程,总时间超过了 di,输入:courses = [[100, 200], [200, 1300], [1000, 1250], [2000, 3200]]第二,修第 3 门课,耗费 1000 天,在第 1100 天完成,在第 1101 天开始下门课程。首先,修第 1 门课,耗费 100 天,在第 100 天完成,在第 101 天开始下门课。输入:courses = [[3,2],[4,3]]

2023-07-17 21:31:25 373

原创 leedcode 1326. 灌溉花园的最少水龙头数目

给你一个整数 n 和一个长度为 n + 1 的整数数组 ranges ,其中 ranges[i] (下标从 0 开始)表示:如果打开点 i 处的水龙头,可以灌溉的区域为 [i - ranges[i], i + ranges[i]]。dp[k] = min(dp[k], dp[start]+1), 其中 k的范围为 [start, end]。输入:n = 5, ranges = [3,4,1,1,0,0]输入:n = 3, ranges = [0,0,0,0]点 2 处的水龙头可以灌溉区间 [1,3]

2023-07-16 18:47:49 281

原创 leetcode 1802. 有界数组中指定下标处的最大值

解释:数组 [1,1,2,1] 和 [1,2,2,1] 满足所有条件。abs(nums[i] - nums[i+1]) <= 1 ,其中 0 <= i < n-1。注意:abs(x) 等于 x 的前提是 x >= 0;否则,abs(x) 等于 -x。输入:n = 6, index = 1, maxSum = 10。输入:n = 4, index = 2, maxSum = 6。nums[i] 是 正整数 ,其中 0 <= i < n。返回你所构造的数组中的 nums[index]。

2023-07-16 18:02:45 393

原创 leetcode 22 括号生成

输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。思路:直接用暴力做法,对括号进行全排列,然后剪纸判断,时间复杂度会超。提示:1 <= n <= 8。

2023-07-16 14:52:51 255

原创 leetcode 316. 去除重复字母

给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。输入:s = “cbacdcbc”输入:s = “bcabc”s 由小写英文字母组成。

2023-07-15 22:14:03 345

原创 leetcode 542. 01 矩阵

可以采用广度遍历的方式来做,先把所有为 0 的元素进队列,然后依次计算出其临近的元素的距离,依次直到把矩阵中所有的元素的距离都计算完。输入:mat = [[0,0,0],[0,1,0],[0,0,0]]输入:mat = [[0,0,0],[0,1,0],[1,1,1]]输出:[[0,0,0],[0,1,0],[0,0,0]]输出:[[0,0,0],[0,1,0],[1,2,1]]两个相邻元素间的距离为 1。mat 中至少有一个 0。

2023-07-15 09:56:02 1203

原创 leetcode 1110. 删点成林

采用 dfs 的方式来做,首先判断 节点是否是根节点,如果结点是根节点,且不会被删除,那么就把该节点就会被添加到结果数组中,如果根节点被删除,那么其子节点会变成跟节点。如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。输入:root = [1,2,3,4,5,6,7], to_delete = [3,5]输入:root = [1,2,4,null,3], to_delete = [3]输出:[[1,2,null,4],[6],[7]]

2023-07-11 20:09:44 225

原创 剑指 offer 44 数字序列中某一位的数字

思路:以 13 为例, 因为 13>=10,故到 13 的时候数字肯定是两位数,我们可以把前面的 0,1,2,3…9 前面补 0 变成 00,01,…09, 这样相当于在全是两位数的 00,01,02,…99 中查找第 23位对应的数字。的格式作为一个字符序列,在这个序列中第 2 位(从下标 0 开始计算)是 2 ,第 10 位是 1 ,第 13 位是 1 ,以此类题,请你输出第 n 位对应的数字。第 23 为对应 数字 11 中的第2位(str=‘11’ 的 index 为 1 的那一位)

2023-07-10 11:13:41 83

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除