自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录day42,动态规划part10

dp[i]表示以第。

2026-03-02 11:45:06 629

原创 代码随想录day39/40,动态规划part8/9(股票问题)

买卖股票的最佳时机 IV给你一个整数数组 和一个整数 ,其中 是某支给定的股票在第 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 笔交易。也就是说,你最多可以买 次,卖 次。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1: 输入:k = 2, prices = [2,4,1] 输出:2 解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润

2026-02-28 11:54:41 662

原创 代码随想录day38,动态规划part7

打家劫舍系列总共有三道。第一道是比较标准的动态规划问题,而第二道融入了环形数组的条件,第三道更绝,把动态规划的自底向上和自顶向下解法和二叉树结合起来。

2026-02-27 10:41:54 620

原创 代码随想录day37,动态规划part6

每种物品。

2026-02-25 14:54:35 740

原创 代码随想录day36,动态规划part5

两个状态就有一个二维dp数组,

2026-02-24 20:00:29 610

原创 代码随想录day35,动态规划part4

力扣题目链接有一堆石头,用整数数组 表示。其中 表示第 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 和 ,且 。那么粉碎的可能结果如下:如果 ,那么两块石头都会被完全粉碎;如果 ,那么重量为 的石头将会完全粉碎,而重量为 的石头新重量为 。最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 。示例 1:输入:stones = [2,7,4,1,8,1]输出:1解释:组合 2 和 4,得到 2,所以数组转化为 [

2026-02-23 20:25:55 617

原创 代码随想录day34,动态规划part3

小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的空间,并且具有不同的价值。小明的行李空间为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料只能选择一次,并且只有选与不选两种选择,不能进行切割。输入描述:第一行包含两个正整数,第一个整数 M 代表研究材料的种类,第二个正整数 N,代表小明的行李空间。第二行包含 M 个正整数,代表每种研究材料的所占空间

2026-02-22 13:47:35 568

原创 代码随想录day33,动态规划part2

一个机器人位于一个 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?输入:m = 3, n = 7输出:28思路状态定义: 表示从起点到达 的路径数状态转移:找到转移方程很重要机器人只能从上方 (i-1, j) 或左方 (i, j-1) 过来所以:dp[i][j] = dp[i-1][j] + dp[i][j-1]表格中的每一个值都是斜对角的两个值

2026-02-22 00:05:02 571

原创 代码随想录day32,动态规划part1

然后推测上i-1层楼梯,有dp[i - 1]种方法,再跳一个台阶就是dp[i],比如到2层有2种方法,每种再走1步都能到3层 → 贡献。所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);上i-2层楼梯,有dp[i -2]种方法,因为到 i-2 层有 dp[i-2] 种方式,再走2步到i层。dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]- 支付 15 ,向上爬两个台阶,到达楼梯顶部。

2026-02-14 23:01:14 661

原创 代码随想录day31,贪心算法part5

1,3] → 保留,prevEnd=3 [2,4] → 2<3重叠,移除(count=1),保留[1,3](结束早) [3,5] → 3>=3不重叠,保留,prevEnd=5 [6,7] → 6>=5不重叠,保留。合并区间(左端点排序): [1,3] → 加入 [2,4] → 重叠,合并为[1,4] [3,5] → 重叠,合并为[1,5] [6,7] → 不重叠,加入。无重叠区间(右端点排序): 排序后:[[1,3], [2,4], [3,5], [6,7]](按右端点也是这个顺序)

2026-02-13 12:41:17 547

原创 代码随想录day30,贪心算法part4

目标:移除最少数量的区间,使剩余不重叠思路:按右端点排序(结束早的优先保留)优先保留结束早的,给后面留空间输入:[[1,2],[2,3],[3,4],[1,3]] 按右端点排序:[[1,2],[2,3],[1,3],[3,4]]遍历:[1,2]: 保留,end=2[2,3]: 2>=2,不重叠,保留,end=3[1,3]: 1<3,重叠,移除(count++)[3,4]: 3>=3,不重叠,保留​结果:移除1个。

2026-02-12 15:47:23 673

原创 代码随想录day29,贪心算法part3

因此 [[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]]此时油箱有 = 0 + 4 = 4 升汽油。处理[6,1]:插入位置1 → [[7,0],[6,1],[7,1]] (6比7矮,不影响7的k值)输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]处理[5,0]:插入位置0 → [[5,0],[7,0],[6,1],[7,1]]

2026-02-11 20:48:14 613

原创 代码随想录day28,贪心算法part2

过程: i=0: nums[0]=2, maxReach = max(0, 0+2) = 2 i=1: i=1 <= maxReach=2 ✓, nums[1]=3, maxReach = max(2, 1+3) = 4 4 >= 4(最后位置),返回true!那么又是一个贪心:局部最优:只找数值最小的正整数进行反转,当前数值和可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了),全局最优:整个 数组和 达到最大。跳两步到1,1只可以继续跳1步;

2026-02-10 23:13:47 649

原创 代码随想录day27,贪心算法part1

是提前排除不可能的答案,使树结构尽可能小,最终的算法复杂度一般是指数级别;优,贪心算法是有些问题其实不需要完整地穷举所有可行解,就可以推导出最优解。这样一来,进一步减少了穷举空间,效率自然会更高。

2026-02-09 19:31:15 582

原创 代码随想录day25,回溯算法part4

假如输入的[1, 2, 3, 1, 1],原序列递增子序列:[1,2,3], [1,2], [1,3], [2,3], [1,1,1]等,排序后:[1,1,1,2,3]会得到 [1,1,2], [1,1,3] 等,但原序列中这些1不相邻,不能随意组合!输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]所以现在的关键在于,

2026-02-08 23:16:36 653

原创 代码随想录day24,回溯算法part3

在元素个数为1的子集上写出元素个数为2的子集[1]-->[1,2],[1,3],[2]-->[2,3]。[2]中如果添加1,那就会和之前的[1,2]重复。输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]接下来是在空集基础上生成元素个数为 1 的所有子集[1],[2],[3]。输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]中拿 2 个元素形成所有的组合,就是所有大小为 2 的子集。接下来是元素个数为3的子集,[1,2]-->[1,2,3]。

2026-02-06 11:13:26 610

原创 代码随想录day23,回溯算法part2

力扣题目链接给你一个 无重复元素 的整数数组 和一个目标整数 ,找出 中可以使数字和为目标数 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 的不同组合数少于 个。示例 1: 输入:candidates = [2,3,6,7], target = 7 输出:[[2,2,3],[7]] 解释: 2 和

2026-02-05 18:08:54 343

原创 代码随想录day22,回溯算法part1

例如 k = 2,n = 4的话,就是在集合[1,2,3,4,5,6,7,8,9]中求 k(个数) = 2, n(和) = 4的组合。相对于上一题77,无非就是多了一个限制,本题是要找到和为n的k个数的组合,而整个集合已经是固定的了[1,...,9]。为 ["ad","ae","af","bd","be","bf","cd","ce","cf"],符合预期。输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]中的元素可以存在重复,每个元素最多只能被使用一次。

2026-02-04 17:28:33 637

原创 代码随想录day21 二叉树part8

确定递归终止条件:这里定义的是左闭右闭的区间,所以当区间 left > right的时候,意味着当前区间无元素可处理,对应 BST 的 “空节点”,直接返回。

2026-02-03 16:15:05 549

原创 代码随想录day20 二叉树part7

对于返回值可以有,也可以没有,但递归函数如果没有返回值的话,实现是比较麻烦的,有返回值的话,可以利用返回值完成新加入的节点与其父节点的赋值操作。给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。例:若删除值为 7 的节点(右子树最左节点是 8),则将 7 的左子树(以 5 为根)挂到 8 的左孩子,再用 9 为根的右子树替代 7,最终树仍满足 BST。(即目标节点的 “后继节点”),用它承接目标节点的左子树,再用右子树整体替代目标节点,可保证 BST 性质不变。

2026-02-02 12:03:09 553

原创 代码随想录day18 二叉树part6

在有序序列中,“众数”(出现频率最高的元素)必然是 “相邻重复元素”,无需额外用哈希表统计全局频率 —— 只需遍历过程中对比 “当前节点” 与 “前一个节点”,即可统计单个元素的连续出现次数,进而找到所有众数。(说明不是第一个节点),计算 “当前节点值 - pre 节点值”(因中序有序,当前值一定大于 pre 值,无需取绝对值),并将结果更新为 “当前最小值” 和 “新差值” 中的较小者。如果不是二叉搜索树,最直观的方法一定是把这个树都遍历了,用map统计频率,把频率排个序,最后取前面高频的元素的集合。

2026-02-01 19:54:24 602

原创 代码随想录day17 二叉树part5

确定终止条件:题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。递归合并左子树(树 1 的 3 vs 树 2 的 1)→ 3+1=4,再递归它们的子树(树 1 左子树空,直接复用树 2 左子树的 4);- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5]。- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1]。

2026-02-01 17:11:29 654

原创 代码随想录day16,二叉树part4

左根右 →。

2026-01-29 23:33:27 629

原创 代码随想录day15,二叉树part3

节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。就是。

2026-01-28 17:10:15 769

原创 代码随想录day14,二叉树part2

遍历的过程中去翻转每一个节点的左右孩子就可以达到整体翻转的效果。层序遍历只要把每一个节点的左右孩子翻转一下的遍历方式都是可以的!比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。确定单层递归的逻辑:处理 左右节点都不为空,且数值相同的情况。左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。左节点为空,右节点不为空,不对称,return false。右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。111二叉树最小深度的递归代码,注意注释和最大深度的区别。

2026-01-27 11:33:32 613

原创 代码随想录day13,二叉树part1

如果可以,写出这个递归函数的定义,并充分利用这个函数的返回值,这叫。

2026-01-26 18:00:58 570

原创 代码随想录day11,栈与队列part2

例如:4 + 13 / 5,这就是中缀表达式,计算机从左到右去扫描的话,扫到13,还要判断13后面是什么运算符,还要比较一下优先级,然后13还和后面的5做运算,做完运算之后,还要向前回退到 4 的位置,继续做加法。利用双端队列手动实现单调队列,用一个单调队列来存储对应的下标,每当窗口滑动的时候,直接取队列的头部指针对应的值放入结果集即可。push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止。

2026-01-23 18:09:24 856

原创 代码随想录day10,栈与队列part1

add只能尾部入,poll只能头部出。

2026-01-23 11:47:04 994

原创 代码随想录day09,字符串part2

给定一个字符串,逐个翻转字符串中的每个单词。示例 : 输入: "the sky is blue" 输出: "blue is sky the"本题的难度:不要使用辅助空间,空间复杂度要求为O(1)。解题思路如下,源字符串为:"the sky is blue "移除多余空格 (首尾的空格): "the sky is blue"字符串反转:"eulb si yks eht"单词反转:"blue is sky the"第一步移除空格,就和之前的移除数组中的元素一样,第二步和第三步反转字符串,参考字符串part1中的

2026-01-22 17:31:33 734

原创 代码随想录day08,字符串part1

在反转链表中,使用了双指针的方法。的做法:对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。示例 1: 输入:["h","e","l","l","o"] 输出:["o","l","l","e","h"]从上面两个题也能看出,字符串跟数组是差不多的,字符串是若干字符组成的有限序列,也可以理解为是一个字符数组。

2026-01-21 12:05:23 354

原创 代码随想录day07,哈希表part2

四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n2),四数之和的时间复杂度是O(n3)。如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。

2026-01-20 16:30:37 1087

原创 代码随想录day06,哈希表part1

就是,如果在索引1发生碰撞,那就是说有两个元素都映射到了1,那就在1这个位置存储在链表上。比如说想要把[123456],如果将每个数字减1,就可以将他们映射到另一个数组[012345],另一个数组上的位置就是他们的索引。用这个record数组来记录字符串s里字符出现的次数,s 里出现的字母 +1,t 里出现的字母 −1,最后 26 个槽全为 0 才能说明是字母异位词。res[1]存储后遍历到的元素的下标(即 i),因为 i是当前循环的索引,比哈希表中存储的 j(map.get(temp))更大。

2026-01-19 18:40:04 1023

原创 代码随想录day04,链表part2

这次的题都是双指针解法,连上上次的206.反转链表(快慢指针),除了基础的删除链表,设计链表,剩下的链表题都是用双指针求解。

2026-01-16 17:33:56 688

原创 代码随想录day03 链表part1

链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链表是通过指针域的指针链接在内存中各个节点。所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上。链表的入口节点称为链表的头结点也就是head。跟数组不一样,包括单链表、双链表、循环链表。中的指针域只能指向节点的下一个节点。的每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。

2026-01-16 16:16:00 926

原创 代码随想录day02,数组part2

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。输入描述:第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。这个题就是前缀和的思路,先统计好,前n行的和 q[n],求矩阵 a行 到 b行 之间的总和,那么就 q[b] - q[a - 1]就好。输入示例:输入长度为5的数组[1,2,3,4,5],0-1的和为3,1-3的和为9。- 输入:s = 7, nums = [2,3,1,2,4,3]

2026-01-15 17:44:09 462

原创 代码随想录第一天,数组part1

数组可以方便的通过下标索引的方式获取到下标对应的数据。并且①数组内存空间的地址是连续的**正因为数组在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。例如删除下标为3的元素,需要对下标为3的元素后面的所有元素都要做移动操作,给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

2026-01-14 16:45:47 347

空空如也

空空如也

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

TA关注的人

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