- 博客(62)
- 收藏
- 关注
原创 (二刷)代码随想录第23天|538.把二叉搜索树转换为累加树 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树
一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。108.将有序数组转换为二叉搜索树。538.把二叉搜索树转换为累加树。669. 修剪二叉搜索树。669. 修剪二叉搜索树。
2024-07-22 23:03:08
283
原创 (二刷)代码随想录第21天|236. 二叉树的最近公共祖先
递归三部曲:1、确定参数和返回值:2、确定中止条件:3、确定单层递归的逻辑:后序遍历:501. 二叉搜索树中的众数 二叉搜索树的中序遍历是有序的。530.二叉搜索树的最小绝对差二叉搜索树是有序的。将二叉树转换成有序数组来算。
2024-07-20 23:02:03
294
原创 (二刷)代码随想录第20天|654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
二叉搜索树是一个有序树,若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不为空,则右子树上所有节点的值均大于根节点的值;- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5]。- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1]。- [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1]。- [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 []。
2024-07-15 09:51:13
820
原创 (二刷)代码随想录第18天|513.找树左下角的值● 112. 路径总和 113.路径总和ii● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
这个题一眼就是层序遍历,但是在自己写的过程中有一个疑惑:层序遍历的过程中怎么确定二叉树的一层已经遍历完了呢?5月底至6月中旬一直都在复习(预习)期末考试,所以没刷题,6.17-6.27小学期,学校安排了课程和作业。2、如果不为空,取后序数组最后一个元素作为节点元素;3、找到节点元素在中序数组中的位置,作为切割点。4、切割中序数组,切成中序左数组和中序右数组;5、切割后序数组,切成后序左数组和后序右数组;1、如果数组大小为0,说明为空节点;6、递归处理左区间和右区间;513.找树左下角的值。
2024-07-07 20:18:28
379
原创 (二刷)代码随想录第17天|● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和
3、确定单层遍历的逻辑:当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。递归的遍历顺序为后序遍历。2、确定终止条件:只有当前遍历的节点是父节点,才能判断其子节点是不是左叶子。所以如果当前遍历的节点是叶子节点,那其左叶子也必定是0。这棵树的左右子树的高度差小于1的时候,同时该树的左右子树都是平衡二叉树的时候,这棵树才是平衡二叉树;1、确定函数的参数和返回值:传入树的根节点,递归函数的返回值为数值之和,所以为int类型;
2024-05-29 15:26:47
513
原创 (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
和最大深度有所不同,如果只是把最大深度的代码copy过来,将max改为min的话,实例2:[2,null,3,null,4,null,5,null,6] 无法测试通过。注意深度是指节点数,因此要+1,不+1算出来的是高度。和求深度的题非常类似。
2024-05-28 15:52:15
279
原创 (二刷)代码随想录第13天|239.滑动窗口最大值 347.前k个高频元素
这里使用小顶堆比较合适,把小顶堆里的出现次数少的值弹出后,堆里留下出现次数多的值,就是我们需要求的。的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的。堆是一颗完全二叉树,树中每个节点的值都不大于或小于其左右孩子的值。给定一个非空的整数数组,返回其中出现频率前 k 高的元素。滑动窗口的位置 最大值。滑动窗口每次只向右移动一位。
2024-05-22 11:25:41
546
原创 (二刷)代码随想录第11天|● 20. 有效的括号● 1047. 删除字符串中的所有相邻重复项
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。2、右括号多余,在匹配过程中,栈已经为空,栈中找不到可以匹配的元素,不匹配;3、括号类型不匹配,匹配完成后,栈中找不到匹配的元素,不匹配;1、左括号多余,栈不为空,不匹配;
2024-05-21 16:02:06
353
原创 (二刷)代码随想录第10天|理论基础● 232.用栈实现队列● 225. 用队列实现栈
push(x) -- 将一个元素放入队列的尾部。peek() -- 返回队列首部的元素。empty() -- 返回队列是否为空。pop() -- 从队列首部移除元素。
2024-05-18 16:25:37
602
原创 (二刷)代码随想录第8天|344.反转字符串● 541. 反转字符串II
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组。如果剩余字符少于 k 个,则将剩余字符全部反转。输入: s = "abcdefg", k = 2。、使用 O(1) 的额外空间解决这一问题。不要给另外的数组分配额外的空间,你必须。输出: "bacdfeg"
2024-05-16 00:16:58
536
原创 (二刷)代码随想录第7天|454.四数相加II ● 383. 赎金信 ● 15. 三数之和
考虑这样一个场景:假设数组中有重复的元素,例如 `[0, 0, 0]`,如果我们不进行去重操作,那么可能会出现多个相同的三元组 `[0, 0, 0]` 被添加到结果列表中。给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]给定数组 nums = [-1, 0, 1, 2, -1, -4],
2024-05-15 11:41:14
900
原创 (二刷)代码随想录第6天|242.有效的字母异位词、349.两个数组的交集
在 C++ 中,`std::set` 是一个使用红黑树实现的有序集合,它不允许重复元素。`std::multiset` 也是一个使用红黑树实现的有序集合,但它允许存储重复元素。`std::unordered_set` 是一个使用哈希表实现的无序集合,它不允许重复元素。与 `std::set` 相似,它保持元素的自然排序(如果元素类型实现了 `Comparable` 接口)或使用提供的比较器进行排序。需要注意的是,Java 中的集合框架与 C++ 中的 STL 有些许差异,但提供了类似的功能。
2024-05-14 20:45:40
689
4
原创 (二刷)代码随想录第4天|24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。因为本题要操作头节点,所以要设置虚拟头节点dumyhead;给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。
2024-05-12 00:17:30
701
1
原创 (二刷)代码随想录第1天|704. 二分查找 27. 移除元素
2、if(nums[mid] > target) right 要赋值为mid-1,因为在这之前已经判断出了mid的值不等于target, 那么mid的值就没必要再包含在要搜索的区间内了。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。1、这时候while(left <= right) 中的=不能掉,因为left=right是有意义的;
2024-05-08 22:47:37
1445
原创 代码随想录第52天|300.最长递增子序列 718. 最长重复子数组
3、dp数组如何初始化:根据dp[i][j] 的定义,dp[i][0] 和dp[0][j] 都是没有意义的,但是为了方便为了方便递归公式dp[i][j] = dp[i - 1][j - 1] + 1;将dp[i][0] 和dp[0][j] 初始化为0。1、确定dp数组以及下标的含义:dp[i][j]:以下标i-1结尾的A,和以下标j-1为结尾的B,最长重复子数组为dp[i][j]。2、确定递推公式:当A[i-1]=B[i-1], dp[i][j] = dp[i-1][j-1] + 1;
2024-05-07 22:59:31
823
原创 代码随想录第51天 | 309.最佳买卖股票时机含冷冻期
达到买入股票的状态,即dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);1、确定dp数组以及下标的含义:dp[i][j]:第i天的状态为j,所剩的最多现金为dp[i][j]。达到保持卖出股票的状态:即dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);达到今天就卖出股票的状态:即dp[i][2] = dp[i - 1][0] + prices[i];
2024-05-06 21:31:14
389
原创 代码随想录第50天|123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV
两者比较选大的:dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);4.第二次不持有股票。所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2]);dp[i][0] 中表示第i天,j表示[0-4]五个状态。①、第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i];②、第i天没有操作,而是沿用第i-1天的状态,即dp[i][1] = dp[i - 1][1];
2024-04-29 22:53:25
547
原创 代码随想录第49天|121. 买卖股票的最佳时机 122.买卖股票的最佳时机II
那么dp[0][0]表示第0天持有股票,此时的持有股票就一定是买入股票了,因为不可能有前一天推出来,所以dp[0][0] -= prices[0];②、第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i]①、第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]dp[0][1]表示第0天不持有股票,不持有股票那么现金就是0,所以dp[0][1] = 0;
2024-04-27 22:23:40
1228
原创 代码随想录第48天|198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III
3、dp数组如何初始化:从递推公式dp[i] = max(dp[i-2] + nums[i], dp[i-1])可以看出,dp公式最终的基础就是dp[0]和dp[1], dp[0] 一定是nums[0] , dp[1] 就是nums[0] 和nums[1] 的最大值:dp[1] = max(nums[0], nums[1]);如果不偷i房间,那么dp[i] = dp[i-1],考虑i-1房,然后dp[i] 取最大值,即dp[i] = max(dp[i-2] + nums[i], dp[i-1])。
2024-04-26 22:49:35
1131
原创 代码随想录第46天|139.单词拆分
1、确定dp数组以及下标的含义:dp[i]: 字符串长度为i的话,dp[i] 为true, 表示可以拆分成一个或多个在字典里出现的单词;给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。2、确定递推公式:如果[j,i] 这个区间的子串出现在字典里,且dp[j] 为true,那么dp[i] 一定为true。3、dp数组如何初始化:dp[0]一定要为true,否则dp[0] 为false的话,后面的值就全为false了;
2024-04-25 22:03:04
415
原创 代码随想录第45天|70. 爬楼梯 (进阶)322. 零钱兑换
4、确定遍历顺序:本题求钱币的最小个数,钱币有顺序或者没有顺序都可以,不影响钱币的最小个数,所以本题不强调是组合还是排列。当 m = 2,n = 3 时,n = 3 这表示一共有三个台阶,m = 2 代表你每次可以爬一个台阶或者两个台阶。1、确定dp数组以及下标的含义:dp[i]:爬到i个台阶的楼顶,有dp[i] 种方法;3、dp数组如何初始化:dp[0]=1, 如果dp[0]=0的话,其他值就也没有结果了。2、确定递推公式:dp[j] = min(dp[j-coin[i]], dp[j])
2024-04-25 20:36:13
828
原创 代码随想录第44天|动态规划:完全背包理论基础 518.零钱兑换II 377. 组合总和 Ⅳ
4、确定遍历顺序:求组合是外层for循环遍历物品,内层for循环遍历背包;2、确定递推公式:dp[j]就是所有的dp[j-coins[i]]相加,所以dp[j] += dp[j - coins[i]]问题会产生何种变化?1、确定dp数组以及下标的含义:dp[i]:凑成目标正整数为i的排列个数为dp[i];4、确定遍历顺序:如果求组合数就是外层for循环遍历物品,内层for循环遍历背包;2、确定递推公式:dp[i] += dp[i - nums[j]];dp[j] 凑成总金额j的货币组合数为dp[j];
2024-04-24 22:07:09
1190
原创 代码随想录第43天|1049.最后一块石头的重量II 494. 目标和
假设加法对应的总共和为x,那么减法对应的总和就是sum-x;组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],组合 2 和 1,得到 1,所以数组转化为 [1,1,1],组合 2 和 1,得到 1,所以数组转化为 [1,1,1],输入:nums: [1, 1, 1, 1, 1], S: 3。
2024-04-22 21:19:38
647
原创 代码随想录第42天|416. 分割等和子集
2、确定递推公式:dp[j]=max(dp[j] + dp[j]-weight[i]+value[i]),本题中:nums[i] = val[i], 所以:dp[j] = max(dp[j]+dp[j-nums[i]]+num[i])1、确定dp数组以及下标的含义:dp[j]表示:容量为j的背包,所背物品的最大价值也为dp[j];请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值。数组不能分割成两个元素和相等的子集。
2024-04-21 22:08:07
526
2
原创 代码随想录第41天| 96.不同的二叉搜索树 动态规划:01背包理论基础
给你一个整数n,求恰由n个节点组成且节点值从1到n互不相同的有多少种?返回满足题意的二叉搜索树的种数。n = 35n = 11dp[3] , 就是元素1为头节点的搜索树的数量+元素2为头节点的搜索树的数量+元素3为头节点的·搜索树的数量;元素1为头节点的搜索树的数量=右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量;元素2为头节点的搜索树的数量=左子树有1个元素的搜索树数量 * 右子树有1个元素的搜索树数量;
2024-04-19 22:56:34
983
原创 代码随想录第40天|343. 整数拆分
2、确定递推公式:dp[i] 的最大值怎么得到?j*(i-j) 或者 j*dp[i-j];1、确定dp数组以及下标的含义:分拆数字i可以得到的最大乘积为dp[i];3、dp的初始化:dp[2]=1;),并使这些整数的乘积最大化。96.不同的二叉搜索树。你可以获得的最大乘积。
2024-04-18 22:51:54
447
原创 代码随想录第39天|62.不同路径 63. 不同路径 II
2、确定递推公式:根据题意,机器人每次只能向下或向右移动一步,可以看出:要想得到dp[i][j], 只能由两个方向推导出来,即 dp[i][j-1] 以及 dp[i-1][j-],3、dp数组的初始化: 由于从dp[0][0] 到 dp[i][0] 的路径只有一条,所以dp[i][0] = 0;1、确定dp数组以及下标的含义:dp[i][j] 表示从(0,0)出发,到dp[i][j] 有 dp[i][j] 条不同的路径。dp[i][j]表示从(0,0)出发,到(i,j) 有dp[i][j] 条不同的路径;
2024-04-18 21:43:50
1314
原创 代码随想录第38天| 509. 斐波那契数 70. 爬楼梯
还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。所以dp[i] = dp[i - 1] + dp[i - 2]。那么dp[i]就是 dp[i - 1]与dp[i - 2]之和!3、dp数组如何初始化:dp[1] = 1,dp[2] = 2。这道题的公式:dp[i]=dp[i-1]+dp[i-2]该题:dp[0]=0;
2024-04-12 22:55:52
876
原创 代码随想录第36、37天| 435. 无重叠区间 763.划分字母区间 56. 合并区间
这个题第一想法就是双指针法,一个指针i指向区间开头的字母,另外一个指针j从区间最左边向右遍历,直到找到和第一个字母相同的字母,返回这个字母的下标,然后指针i向右移动一位,指针j从原地右移;没看卡哥题解,自己的想法就是先把区间从小到大排序,具体就是比较区间的最左边的值,也就是区间的最小值,最小值小的排前面。像 "ababcbacadefegde", "hijhklij" 这样的划分是错误的,因为划分的片段数较少。1、区间与区间之间一定是不重合的,所以下一个区间起始的位置一定在上一个区间结束位置的后面。
2024-04-11 22:54:09
1033
原创 代码随想录第35天| 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
按照h从大到小排序,h相同时k从小到大:[7,0] [7,1] [6,1] [5,0] [5,2] [4,4]编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。以题目示例: [[10,16],[2,8],[1,6],[7,12]]为例,如图:(方便起见,已经排序)因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。按照k从小到大排序:[5,0] [7,0] [6,1] [7,1] [5,2] [4,4]
2024-04-09 22:53:54
1304
原创 代码随想录第34天| 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4]。开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油。开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油。开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油。开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油。
2024-04-08 22:52:31
1008
原创 代码随想录第32天|455.分发饼干 376. 摆动序列
针对以上情形,result 初始为 1(默认最右面有一个峰值),此时 curDiff > 0 && preDiff <= 0,那么 result++(计算了左面的峰值),最后得到的 result 就是 2(峰值个数为 2 即摆动序列长度为 2)其中一个是 [1, 17, 10, 13, 10, 16, 8] ,各元素之间的差值为 (16, -7, 3, -3, 6, -8)。虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。
2024-04-07 22:47:36
1415
原创 代码随想录第30天|51. N皇后
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。的棋盘上,并且使皇后彼此之间不能相互攻击。如上图所示,4 皇后问题存在两个不同的解法。其实回溯算法搜索过的位置就是一个棋盘。的棋子放置方案,该方案中。每一种解法包含一个不同的。分别代表了皇后和空位.
2024-04-04 21:54:36
585
原创 代码随想录第29天|491.递增子序列 46.全排列 47.全排列 II
可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。3、确定单层搜索逻辑:used[i-1]为false的时候,才保证了是树层上的数值不能相同,而不是树枝上。这道题我第一次看到的时候觉得就是每个位置上每个数字都可以放,但是不知道怎么代码实现。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。,找出并返回所有该数组中不同的递增子序列,递增子序列中。但排列问题需要一个used数组,标记已经选择的元素。
2024-04-03 22:45:36
1251
原创 代码随想录第28天| 131.分割回文串 93.复原IP地址 78.子集
这个题和上一个又有了区别,这题用来切割的符号一定是3个,还要保证切割后每个区间的数值为小于255的数。一开始的想法是先判断整体数值的个数,如果是12位呢,就刚好从第3个数值开始切.....后来想到这样的话if嵌套就太多了。同样用startIndex记录切割的起始位置,还需要一个pointNum来记录逗点的数量,因为一定只能用3个逗点切割,多一个少一个都不行。3、单层搜索的逻辑:[startIndex,i]区间是切割的子串,判断子串是否合法,合法就在后面加上逗号表示正式切割,不符合就结束本层循环。
2024-04-02 22:51:01
1121
原创 代码随想录第27天| 39. 组合总和
排序之后,如果下一层的sum(也就是本层的sum+candidate[i])>target,就可以结束本层遍历的for循环。2、确定终止条件:从上图中可以看到,sum>target或者sum=target的时候终止,sum=target时还要把path返回结果集。第一反应这个题和昨天的相差不大,还是用回溯法,只不过target中的数字可以重复使用。1、确定参数: 定义一个二位数组result存放结果集,一个path存放符合条件的结果。如果至少一个数字的被选数量不同,则两种组合是不同的。
2024-04-01 22:54:19
537
原创 代码随想录第25天|216.组合总和III 17.电话号码的字母组合
局部变量:string digits和index,index用来遍历digits的同时记录遍历到digits的第几个数字;3、确定单层遍历的逻辑:取index指向的数字,取该数字对应的字母:提前把index中的数字和其对应的字母集用map存储起来。在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。从图中可以看出,遍历的深度就是【2、3】数组的长度,叶子节点就是我们要收集的结果。看了卡哥的题解,发现自己对于题目的理解还是有些偏差。
2024-03-31 22:45:02
781
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人