- 博客(70)
- 收藏
- 关注
原创 动态规划卡哥精华
本周小结!(动态规划系列一) | 代码随想录 (programmercarl.com)本周小结!(动态规划系列二) | 代码随想录 (programmercarl.com)本周小结!(动态规划系列三) | 代码随想录 (programmercarl.com)本周小结!(动态规划系列四) | 代码随想录 (programmercarl.com) 本周小结!(动态规划系列五) | 代码随想录 (programmercarl.com)背包总结篇打家劫舍篇: 打家劫舍01 打家劫舍02
2024-06-15 21:17:39
861
原创 二叉树环节
涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。
2024-05-20 16:36:50
754
原创 TOP100 二分法
35. 搜索插入位置给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(log n)的算法。示例 1:2示例 2:1示例 3:4nums为无重复元素的升序排列数组。
2024-04-16 21:29:04
994
原创 TOP100-回溯(二)
本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回!单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。关键点在于:当访问到的位置不是下一个预期值时,直接跳出,然后回溯,不继续下去。递归深度其实就是row控制棋盘的行,每一层里for循环的col控制棋盘的列,一行一列决定了皇后的位置。7 也是一个候选, 7 = 7。
2024-03-28 21:28:17
977
原创 每日一题 518 零钱兑换Ⅱ
递推公式:f[i][j] =f[i-1][j] + f[i][j-coins[i-1]];动归五部曲,首先定义f[i][j]表示使用前i种硬币,凑出金额j的硬币组合数;二者相加得到:dfs(i-1,c)+dfs(i,c-coins[i])选第i种硬币,dfs(i,c-coins[i])递推顺序:外循环,遍历钱币,主要是为了让出现过的钱币不再使用到。不再继续选第i种硬币,dfs(i-1,c)递归边界:dfs(-1,0)=1;表示不同面额的硬币,另给一个整数。初始化,f[0][0]=1;
2024-03-25 11:41:36
461
原创 每日一题 2549统计桌面上的不同数字
你再细瞅一眼,当n大于2时,每一个不就只有n-1是符合的嘛,所以直接return max(1,n-1)第二天,2 和 4 也出现在桌面上,因为 5 % 2 == 1 且 5 % 4 == 1。初看,似乎是个模拟题,但你想想,10^9这范围有点大,不像是!再过一天 3 也出现在桌面上,因为 4 % 3 == 1。在十亿天结束时,桌面上的不同数字有 2 、3 、4 、5。在十亿天结束时,桌面上的不同数字只有两个:2 和 3。因为 3 % 2 == 1 ,2 也出现在桌面上。,开始时,它放在桌面上。
2024-03-23 10:22:49
293
原创 每日一题 1969 数组元素的最小非零乘积
链接:https://leetcode.cn/problems/minimum-non-zero-product-of-the-array-elements/solutions/936621/tan-xin-ji-qi-shu-xue-zheng-ming-by-endl-uumv/数组乘积 1 * 6 * 1 * 6 * 1 * 6 * 7 = 1512 是最小乘积。- 第一次操作中,我们交换第二个和第五个元素最左边的数位。- 第二次操作中,我们交换第三个和第四个元素中间的数位。请你算出进行以上操作。
2024-03-20 09:19:47
262
原创 每日一题 2312卖木头快
纵向切割依次计算 m * 1 + m * (n - 1), m * 2 + m * (n - 2), ......横向切割依次计算 1 * n + (m - 1) * n, 2 * n + (m -2) * n, ......- 2 块 2 x 2 的小木块,售出 2 * 7 = 14 元。- 1 块 2 x 1 的小木块,售出 1 * 3 = 3 元。- 1 块 1 x 4 的小木块,售出 1 * 2 = 2 元。- 1 块 1 x 4 的小木块,售出 1 * 2 = 2 元。上图展示了一个可行的方案。
2024-03-15 09:11:45
845
原创 每日一题 2789合并后数组中的最大元素
3.如果 nums[i]>sum,无法合并,并且这意味着从 i开始向左合并可以得到比 sum 更大的元素和,所以直接更新 sum=nums[i],继续向左合并。从后往前扫描,保存当前最大值;当前一值比后一值小时,停止开始累加,当前最大值与全局最大值做个比较,然后留下较大值;1.初始化元素和 sum=nums[n−1],表示从 n−1开始向左合并。从 i=n−2开始倒着遍历数组。2.如果 nums[i]≤sum,那么就合并,把 sum增加 nums[i]。4.遍历结束,返回 sum。
2024-03-14 10:00:01
385
原创 每日一题 2864 最大二进制奇数
其中一个 '1' 必须出现在最后一位上。而由剩下的数字可以生产的最大数字是 "100"。所以答案是 "1001"。因为字符串 s 中仅有一个 '1' ,其必须出现在最后一位上。所以答案是 "001"。1.其实感觉统计字符1的个数就好,然后末尾放1,然后从左往右重新排列字符串。以字符串形式,表示并返回可以由给定组合生成的最大二进制奇数。字符串中的位,使得到的二进制数字是可以由该组合生成的。再来一个C++,快慢指针,快人一步!
2024-03-13 14:57:46
362
原创 每日一题 2917找出数组中的K-OR值
因为 k == 6 == nums.length ,所以数组的 6-or 等于其中所有元素按位与运算的结果。因此,答案为 2^0 + 2^3 = 9。nums[1]、nums[2]、nums[3]、nums[4] 和 nums[5] 的第 3 位的值为 1。nums[0]、nums[2]、nums[4] 和 nums[5] 的第 0 位的值为 1。nums[0]、nums[1] 和 nums[5] 的第 2 位的值为 1。nums[0] 和 nums[5] 的第 1 位的值为 1。
2024-03-06 15:08:36
343
原创 每日一题 2368受限条件下可到达节点的数目
在不访问受限节点的前提下,只有节点 [0,1,2,3] 可以从节点 0 到达。在不访问受限节点的前提下,只有节点 [0,5,6] 可以从节点 0 到达。然后建树,只有当两个节点都不是受限的(都不在哈希集合中)才连边。从 0出发 DFS 这棵树,统计能访问到的节点个数,即为答案。在不访问受限节点的前提下,返回你可以从节点。个节点组成的无向树,节点编号从。用布尔数组记录哪些节点是受限的。给你一个二维整数数组。上图所示正是这棵树。上图所示正是这棵树。
2024-03-02 12:01:57
375
原创 每日一题 2369
这一二条有重合的部分,想象如果满足二必定满足一,所以只需要判断一是否满足,如果是,则直接跳出;不满足一也不可能满足二,直接不用判断条件二了;一判断结束,开始判断三。数组可以划分成子数组 [4,4] 和 [4,5,6]。如果获得的这些子数组中每个都能满足下述条件。这是一种有效划分,所以返回 true。,你必须将数组划分为一个或多个。感觉子串的题很多都是滑动窗口?,则可以称其为数组的一种。没试出来,直奔题解,哦,dp。存在一种有效划分,返回。该数组不存在有效划分。
2024-03-01 17:14:27
873
原创 每日一题 2673使二叉树所有路径值相等的最小代价
和上面的分析一样,从根到当前节点的路径,除了这两个兄弟节点不一样,其余节点都一样。这是不需要的,把 x增加 y−x就行,因为我们可以增加它们的祖先节点的值,使得它们俩的路径和与其它的路径和相等,这样可以节省操作次数。首先对于满二叉树来说,他可以支持随机读取,对于非叶子节点,2i为左孩子,2i+1为有孩子,(i)下取整为父节点。由于这两条路径除了叶子节点不一样,其余节点都一样,所以为了让这两条路径的路径和相等,必须修改叶子节点的值。考虑根到两个互为兄弟节点(父节点相同)的叶子的两条路径。
2024-02-28 19:48:14
858
原创 TOP100 回溯
摘在前面(作者:liweiwei1419):回溯法采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:1.找到一个可能存在的正确的答案;2.在尝试了所有可能的分步方法后宣告该问题没有答案。
2024-02-27 16:52:04
831
原创 每日一题 2867统计树中的合法路径
(1, 2) 因为路径 1 到 2 只包含一个质数 2。- (1, 3) 因为路径 1 到 3 只包含一个质数 3。- (1, 4) 因为路径 1 到 4 只包含一个质数 2。- (2, 4) 因为路径 2 到 4 只包含一个质数 2。- (1, 2) 因为路径 1 到 2 只包含一个质数 2。- (1, 3) 因为路径 1 到 3 只包含一个质数 3。- (1, 4) 因为路径 1 到 4 只包含一个质数 2。- (2, 4) 因为路径 2 到 4 只包含一个质数 2。
2024-02-27 10:02:30
1220
原创 TOP100 图论
学习课程 1 之前,你需要先完成课程 0;并且学习课程 0 之前,你还应先完成课程 1。1.首先构建一个邻接表,并开始遍历prerequisites数组,记录每一个顶点(一门课)的入度。=(m,n)表示学习m前必须学习n,则m的入度+1,邻接表key=m对应value数组添加n。学习课程 1 之前,你需要完成课程 0。2.再次遍历,每次选择入度为0的顶点,入队,并将判断将相关顶点入度-1。3.最后判断所有入度是否为0,是则可以修完,否则不可以。在选修某些课程之前需要一些先修课程。
2024-02-18 15:58:02
950
原创 TOP100 图论
如何避免这样的重复遍历呢?每走过一个陆地格子,就把格子的值改为 2,这样当我们遇到 2 的时候,就知道这是遍历过的格子了。网格结构的 DFS 与二叉树的 DFS 最大的不同之处在于,遍历中可能遇到遍历过的结点。这是因为,网格结构本质上是一个「图」,我们可以把每个格子看成图中的结点,每个结点有向上下左右的四条边。大致的思路我们不难想到,我们先计算出所有岛屿的面积,在所有的格子上标记出岛屿的面积。然后进行 BFS 遍历,每个结点的相邻结点可能是上、下、左、右四个方向的结点,注意判断结点位于网格边界的特殊情况。
2024-02-17 19:11:22
2374
原创 每日一题 429.N叉树的层序遍历
添加子节点: 若 node 的左(右)子节点不为空,则将左(右)子节点加入队列 queue。2.初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root]。树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。当前层打印循环: 循环次数为当前层节点数(即队列 queue 长度)。4.新建一个临时列表 tmp ,用于存储当前层打印结果。1.特例处理: 当根节点为空,则返回空列表 []。返回值: 返回打印结果列表 res 即可。
2024-02-17 16:39:03
363
原创 TOP100 二叉树(三)
因此顺序肯定是,先根据前序序列确定根节点,然后按照根节点对中序序列做划分,序列以左为左孩子,序列以右是右孩子。递推参数: 根节点在前序遍历的索引 root 、子树在中序遍历的左边界 left 、子树在中序遍历的右边界 right。不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。最开始,想着深度优先搜索,然后给每一个叶节点对应一个列表,然后对列表里的元素,求前缀和。考虑新的右子树的根节点,一直重复上边的过程,直到新的右子树为 null。给定一个二叉树的根节点。
2024-02-08 22:38:37
869
原创 每日一题 力扣993.二叉树的堂兄弟节点
深度优先搜索遍历,使用两类四个变量存储x,y两个值的深度以及父节点,遍历函数中传入该节点、父节点、深度以及要遍历寻找的两个数,找到则放入存储。最后判断,当且仅当深度相同且父节点不同时,返回True,否则返回False。我们给出了具有唯一值的二叉树的根节点。对应的节点是堂兄弟节点时,才返回。如果二叉树的两个节点深度相同,但。,以及树中两个不同节点的值。在二叉树中,根节点位于深度。的节点的子节点位于深度。
2024-02-08 08:26:14
365
原创 TOP100 二叉树(二)
刚开始还想着中序遍历输出元素至列表,然后对列表进行判断,如果其不是升序,则返回false。因为是按照升序递增,最好的方法就是按照二分的方式,以中间元素为跟节点,依次进行建树。保存一个全局变量,用于保存上一个访问到的节点。二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。根节点的值是 5 ,但是右子节点的值是 4。给你一个二叉树的根节点。
2024-02-07 19:57:49
807
原创 每日一题 力扣2641二叉树的堂兄弟节点Ⅱ
再遍历节点时,在父节点处进行修改,更改子节点的值,判断有无兄弟节点,在列表中求和并删除自身与兄弟节点即可。- 值为 7 的节点有两个堂兄弟,值分别为 1 和 10 ,所以值修改为 11。- 值为 10 的节点有一个堂兄弟,值为 7 ,所以值修改为 7。- 值为 1 的节点有一个堂兄弟,值为 7 ,所以值修改为 7。,一个节点的深度指的是从树根节点到这个节点经过的边数。- 值为 5 的节点没有堂兄弟,所以值修改为 0。- 值为 1 的节点没有堂兄弟,所以值修改为 0。请你返回修改值之后,树的根。
2024-02-07 13:57:00
369
原创 每日一题 力扣LCP30.魔塔游戏
小扣当前位于魔塔游戏第一层,共有N个房间,编号为0 ~ N-1。每个房间的补血道具/怪物对于血量影响记于数组nums,其中正数表示道具补血数值,即血量增加对应数值;负数表示怪物造成伤害值,即血量减少对应数值;0表示房间对血量无影响。。假定小扣原计划按房间编号升序访问所有房间补血/打怪,,小扣需对房间访问顺序进行调整,。请返回小扣最少需要调整几次,才能顺利访问所有房间。若调整顺序也无法访问完全部房间,请返回 -1。1解释:初始血量为 1。至少需要将 nums[3] 调整至访问顺序末尾以满足要求。-1。
2024-02-06 21:36:08
612
原创 TOP100-二叉树(一)
递归中,每次遍历子节点时,深度加一,如果发现为空节点,就将深度还原。每一个树而言,其深度为左右子树深度的最大值。对于一个节点来说,其作为中转点的最大直径=左子树深度+右子树深度。使用队列,访问节点,依次将其左右孩子入队,然后按照队列进行访问,访问后出队!3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。是指从根节点到最远叶子节点的最长路径上的节点数。递归体返回当前节点的最大深度,使用遍历来完成!,翻转这棵二叉树,并返回其根节点。给你一棵二叉树的根节点,返回该树的。给你一个二叉树的根节点。
2024-02-05 23:03:16
799
原创 每日一题 力扣1696跳跃游戏
仔细想一想,这个复杂度其实体现在了对于i位置前k个位置里的最大得分的计算上,联想一下,这个其实和滑动窗口类似,因此我们借鉴之前滑动窗口的方法来确定该值,降低时间复杂度!递归式:dp[i]=max(dp[i],max(dp[j]+nums[i])) 其中j∈(i-k,i)1.动态规划:双重循环,动态规划,dp[i]代表跳到i位置获得的最大分值;你可以选择子序列 [1,-1,4,3] (上面加粗的数字),和为 7。你可以选择子序列 [10,4,3] (上面加粗数字),和为 17。
2024-02-05 12:53:40
586
原创 TOP100-链表(四)
递归的终止条件是链表的节点个数小于或等于 1,即当链表为空或者链表只包含 1个节点时,不需要对链表进行拆分和排序。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。因为本链表与其他链表的不同之处在于多了一个指针,因此一遍不够,可以先遍历一遍正常节点,并建立哈希表,然后再次遍历,补齐指针!的做法,快指针每次移动 2 步,慢指针每次移动 1 步,当快指针到达链表末尾时,慢指针指向的链表节点即为链表的中点。指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。
2024-02-04 20:14:57
887
原创 每日一题 力扣292 Nim游戏
但是如果石头堆里有八块石头,你就不可避免地会输掉,因为不管你从一堆石头中挑出一块、两块还是三块,你的对手都可以选择三块、两块或一块,以确保在再一次轮到你的时候,你会面对四块石头。如果总的石头数目为 4 的倍数时,因为无论你取多少石头,对方总有对应的取法,让剩余的石头的数目继续为 4 的倍数。对于你或者你的对手取石头时,显然最优的选择是当前己方取完石头后,让剩余的石头的数目为 4 的倍数。因为在这种情况下不管你取走多少石头,总会为你的对手留下几块,他可以将剩余的石头全部取完,从而他可以在游戏中打败你。
2024-02-04 10:32:58
968
原创 TOP100 链表(三)
双指针,考研必备题目,快指针先走N步,然后继续遍历,当快指针到底时,慢指针所指即为需要删除的节点!你可以假设除了数字 0 之外,这两个数都不会以 0 开头。思路不难,链表题需要对特殊情况以及防止断链等细节着重把握!的链表,表示两个非负的整数。请你将两个数相加,并以相同形式返回一个表示和的链表。有注释的java代码,贴一个大哥的,很详细!思路就是不断求和,每次记录一个进位即可!的方式存储的,并且每个节点只能存储。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。俺的有点粗糙,不太够!
2024-02-03 20:52:20
353
原创 每日一题 Leetcode1690石子游戏Ⅶ
2.否则,先手有两种选择,分别是移除 stones[i]或 stones[j],然后计算得分差值,即 a=s[j+1]−s[i+1]−dfs(i+1,j)和 b=s[j]−s[i]−dfs(i,j−1),我们取两者中的较大值作为 dfs(i,j)的返回值。游戏情况:爱丽丝=13,鲍勃=0,石子=[5,3,1,4]。游戏情况:爱丽丝 = 13,鲍勃 = 8 ,石子=[3,1,4]。游戏情况:爱丽丝 = 18 ,鲍勃 = 8 ,石子=[1,4]。游戏情况:爱丽丝=18,鲍勃=12,石子=[4]。
2024-02-03 11:21:44
483
原创 TOP100-链表(二)
如果存在,则在找到汇点以后,另开一个指向头的指针,同时遍历,下一次两指针会面之时,就是汇点的位置。指针再次到达,则链表中存在环。指针再次到达,则链表中存在环。新链表是通过拼接给定的两个链表的所有节点组成的。来表示链表尾连接到链表中的位置(索引从 0 开始)。双指针,互相比较,较大者先入,然后往后移指针。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。,返回链表开始入环的第一个节点。
2024-02-02 18:21:06
804
原创 每日一题Leetcode 1686石子游戏Ⅵ
因为两个玩家都会按照最有策略,那必然选择自己当前最大的那个呀,因此先排序,然后从后往前遍历比大小,计算两位玩家得分,最终根据得分大小返回。上一段理解错误了,实际上只有n个石头,如果一方拿了某一石头,另一方就拿不到当前位置的石头了!而且,奇数个的情况下,先拿的Alice可以先拿一个!比方说,Alice 拿石子 1 ,Bob 拿石子 2 , Alice 拿石子 0 ,Alice 会得到 6 分而 Bob 得分为 7 分。Alice 拿石子 0 , Bob 拿石子 1 ,他们得分都为 1 分。
2024-02-02 10:50:40
438
原创 每日一题 LCP24.数字游戏
i = 2,将 [1,1,1] 操作成 [1,2,3] 或 [0,1,2],最少 2 次操作;i = 3,将 [1,1,1,2] 操作成 [1,2,3,4] 或 [0,1,2,3],最少 3 次操作;i = 4,将 [1,1,1,2,3] 操作成 [-1,0,1,2,3],最少 3 次操作;i = 5,将 [1,1,1,2,3,4] 操作成 [-1,0,1,2,3,4],最少 3 次操作;i = 5,将 [3,4,5,1,6,7] 操作成 [3,4,5,6,7,8],最少 7 次操作;有问题,不是这样的!
2024-02-01 15:49:52
781
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人