自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【算法训练 day51 买卖股票的最佳时机、买卖股票的最佳时机Ⅱ】

思路与上一题基本一致,唯一不同点在于递推公式,由于可能需要多次的买入卖出,所以递推公式需要修改为:dp[i][0] = max(dp[i-1][1]-prices[i],dp[i-1][0])。dp[i-1][1]表示在第i-1天就卖出股票时荷包持有的钱,减去一个prices[i]就表示在第i天时,又买入了股票荷包的钱,因为是买,所以需要相减。数组含义为:当前天数下,荷包还剩的钱,这个还剩的钱可以为负数。

2024-06-10 16:45:08 325

原创 【算法训练 day50 打家劫舍、打家劫舍Ⅱ、打家劫舍Ⅲ】

不一样在于每次取得值不能是父子节点了,所以需要使用后序遍历,这样就能保证只用考虑本层递归的节点是否需要取。dp数组只用存储两个元素,即该层元素取得话最大值是多少,不取的话最大值是多少。递推公式为:dp[j] = max(dp[j-2]+nums[j],dp[j-1]),初始化dp[0] = nums[0],初始化dp[1] = nums[1]。与上一题类似,但需要针对不同情况进行区分,可将数组分为不带首位元素带末尾元素的、带首位元素不带末尾元素,然后将这两种情况的值都求出来进行对比大小并取最大值。

2024-06-08 18:22:40 317

原创 【算法训练 day48 零钱兑换、完全平方数】

题目是完全背包类型的题目,不过不再是寻求取最大值,而是取最小值。此外,遍历时,遇到INT_MAX也会直接跳过,表示上一个背包容量没有保存数据。换句话就是表示没有找到满足该容量的硬币数量,那么后续一定找不到对应的硬币数量,因为动态规划本质就是需要前面的数据来推出本次循环容量对应数据,所以直接跳过。题目是完全背包很好的一个例题,唯一有特点的地方在于:物品是从1开始的各个数的平方,不再由题目给出具体的数组。

2024-06-06 18:26:18 363

原创 【算法训练 day46 零钱兑换 II、组合总和 Ⅳ】

这次算是二刷算法,第一次刷完了但是没有做博客记录下来,只有代码过程没有个人心得记录,结果就是刷完忘了一大半,故作为学习记录便于后期复习自检。本体需要注意一点,就是dp[0]需要初始化为1,这样才能保证后续更新dp数组时,不会一直都是0。题目要求多个组合也算作一种方法,所以需要先遍历背包容量再遍历物品,这样就能保证后面的物品出现在前面。

2024-06-02 21:28:30 345

原创 【算法训练 day45 最后一块石头的重量 II、目标和、 一和零】

Leecode链接:主要写写思路了,这种题目要有将题目转化成01背包的问题的能力有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x!= y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块 石头。

2024-06-01 19:30:23 816

原创 【算法训练 day44 分割等和子集】

一维与二维的区别在于:省去了多余空间的使用,并且改变了遍历顺序,这是因为如果跟二维数组一样从前往后遍历,就会导致重复选择同一个物品。比如,当i = 1时,dp[1] = 1、dp[2] = 1;当i = 2时,dp[1] = 1、dp[2] = 2,显然是不对的因为一件物品只能选一次。虽然一维省去了空间,但时间复杂很高,leetcode上一维dp的执行用时为300ms左右,空间占用达到了10MB左右;二维dp为100ms左右,同样的二维空间占用达到了98MB左右。

2024-05-31 23:05:39 589

原创 【算法训练 day43 整数拆分、不同的二叉搜索树】

需要把握好一个数的最大乘积一般是两个相同的数相乘,在拆分成三个以上的数相乘时,只需要写j * dp[i-j]即可,因为j不需要拆分,如果拆分,那就是四个数相乘了。把握好树二叉搜索树的种类 = 左子树的搜索树种类+右子树的搜索树种类。dp[1] = 1,dp[2] = 2,即可得到dp[3]的值。

2024-05-29 18:17:21 400

原创 【算法训练 day42 不同路径、不同路径Ⅱ】

这次算是二刷算法,第一次刷完了但是没有做博客记录下来,只有代码过程没有个人心得记录,结果就是刷完忘了一大半,故作为学习记录便于后期复习自检。与爬楼梯类似,点(i,j)与他上一个点还有跟他左边的点有关。因为要达到i,j必须经过这两条路径,只需要将这两条路径的和相加即可。题目相对上一题难度有提升,但核心思想基本一致,都是先初始化,然后遍历一步一步得出到达坐标(i,j)的方法。

2024-05-28 10:24:29 1010

原创 【算法训练 day41 斐波那契数、爬楼梯、使用最小花费爬楼梯】

整体比较简单,是动态规划的基础题。题目是基础的动态规划题。

2024-05-27 20:39:42 475

原创 【算法训练 day39 单调递增的数字】

题目需要注意的是100这个数字有点特殊,按照思路,答案是90,最后一位没有取9,所以需要记录右边大于左边的坐标值,并从该位置循环取9,这样才能保证取到数字是最大的。

2024-05-26 20:17:59 161

原创 【算法训练 day38 无重叠区间、长度最小的子数组、合并区间】

判断是否重叠只需要在排序后,判断前一个数组的末尾元素是否严格大于后一个数组开头元素就行。题目本质还是判断是否有重叠区间,但最终代码思路更为简洁。//cpppublic:// 区间集合为空直接返回// 排序的参数使用了lambda表达式});// 第一个区间就可以放进结果集里,后面如果重叠,在result上直接合并i++) {if (result.back()[1] >= intervals[i][0]) { // 发现重叠区间。

2024-05-24 11:13:58 996

原创 【算法训练 day37 柠檬水找零、长度最小的子数组、用最少数量的箭引爆气球】

整体比较简单。题目思路很巧妙,还是需要进行两次的排序,属于想不到就做不出来。思路有但是卡在了如何保存上一个重叠气球的坐标值上,解决办法是如果重合了,就保存在本次循环i表示的右坐标上,因为下次对比所对比的就是上一次循环的右节点的右坐标是否大于本次循环的左坐标。

2024-05-23 19:54:00 627

原创 【算法训练 day36 K 次取反后最大化的数组和、加油站、分发糖果】

难度不算特别大,要有贪心思路。题目思路比较巧妙,需要利用好gas[i] - cost[i]的总和。有一定难度,思路比较容易想到,代码实现能力上还有欠缺。

2024-05-22 22:34:05 899

原创 【算法训练 day35 买卖股票最佳时机、跳跃游戏、跳跃游戏Ⅱ】

题目的贪心在于每次都记录最大边界值,并判断最大值是否达到数组边界。比跳跃游戏要难,不仅要判断是否到达了数组末尾,还要判断跳的最少步数。

2024-05-22 10:26:07 271

原创 【算法训练 day34 分发饼干、摆动序列、最大子数组和】

整体比较简单,但有更好的解决办法。题目有许多细节需要进行判断,首先是普通情况,一个点的左右都是严格单调递增与递减出现,此时直接count自增,并将当前的差值cur赋值给pre,为后续判断做准备。特殊情况,单调递增与单调递减之间出现了连续相等的值,这时需要将这些值相等情况忽略掉,忽略的方法就是在判断时添加=。例如:某个点与后一个点的差值为负值时,前一个点与当前点差值为零时,我们认为这是摆动的,例如[2,1,1,2]。

2024-05-20 16:13:46 656

原创 【算法训练 day32 重新安排行程、N皇后、解数独】

整体比较难,需要留意的点比较多,首先是映射关系的建立,还有如何对map取出元素进行遍历。其次什么时候才算使用完所有机票并且在数组的序列是最小的,这一点比较巧妙,保证最小的操作是映射的内层使用了map,而不是unordered_map,保证了第一个就是最小的string。如果找到了一条路径那么就立即退出,不需要回溯,因为找到了一定是符合题意了。本题需要注意如何判断斜边,主要判断两个方向,一个是左斜上,一个是右斜上。因为如果有元素,一定是上面有元素,所以不需要判断左斜下与右斜下。

2024-05-18 21:33:22 284

原创 【算法训练 day31 非递减子序列、全排列、全排列Ⅱ】

整体难度中等,把握好哈希数组什么时候发挥作用,题目要求的是不能出现重复组合,又不能排序进行去重,所以这个哈希数组在每一层都需要重新设置为0,这样就能保证不同的递归层所有元素都是未被取到的状态,相同递归层保存了取到相同元素的状态。又因为每次传入递归的index参数都是i+1,一定不是本身,做到了去除本身的目的。简单题,这题与非递减子序列中都用到了数组来标记是否用到元素,区别是一个是局部变量,一个是作为引用参数传递,作用类似全局变量。具体该用哪个时可以画个图来判断。

2024-05-17 10:51:37 767

原创 【算法训练 day30 复原IP地址、子集、子集Ⅱ】

难度中等,与分割回文串那题类似,需要注意的点有:插入结果的条件不再依靠index,而是依据段数;递归时不能传入i+1,因为插入字符后,前面的字符都往后移动一位;插入结果时需要对最后一段进行额外的一次判断,因为会有这种情况:192.168.1.399,这显然是不对的。

2024-05-16 10:53:47 760

原创 【算法训练 day29 组合总和、组合总和Ⅱ、分割回文串】

整体比较简单。本题要求不能有重复元素,其实有两层含义。第一:每个元素不能重复选取它自己;第二:在满足第一个重复条件下,最终结果不能出现重复的组合比如:[1,2,5]与[2,1,5]。第一个比较容易实现,每次递归传递下标值时自加1即可,第二个需要额外进行判断,这就体现出排序的好处了。排好序后,如果当前下标不为传递过来的index值且该下标代表的值与index代表的值相同,则应该跳过该值,因为该值已经在前面使用过了。

2024-05-15 12:10:05 645

原创 【算法训练 day28 组合总和Ⅲ、电话号码的字母组合】

以示例数据为例,出现了[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”,“dd”,“de”,“df”,“ed”,“ee”,“ef”,“fd”,“fe”,“ff”]的结果。思路很简单,首先将数字与字母做好映射,然后根据digits字符串开始遍历映射好的数组。遍历前取出对应的字符串,后面的操作与上一题类似。给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。与组合总和类似,只不过递归的退出条件改变为path中数目为k个数且总和为n。

2024-05-14 11:05:12 270

原创 【算法训练 day27 组合问题】

题目用到循环加递归,可以看作一个n叉树,画个图比较好理解。记住关键点,for是对每层树的n个节点进行遍历,递归是用来进入下一层孩子节点的。

2024-05-13 10:52:21 228

原创 【算法训练 day25 修剪二叉搜索树、将有序数组转化为二叉搜索树、把二叉树搜索转化为累加树】

这道题我跟视频链接的思路稍微有点不一样,我用的是后序遍历。如果不是叶子节点,那么需要对右子树着重判断,因为如果该节点值不满足[low,high]区间,不代表该节点的右子树值不满足这个区间,如果满足就返回右子树的节点,否则返回空。给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。数组是有序的,每次取数组中间值,然后将数组切割,左区间左子树递归处理,右区间右子树递归处理。

2024-05-12 11:45:17 276

原创 【算法训练 day24 二叉搜索树的最近公共祖先、二叉搜索树的插入操作、删除二叉搜索树的节点】

比较简单虽然代码不多,但需要对二叉搜索树的特性比较了解才能写出代码。简单题,本体没有具体递归的遍历顺序,所以中间节点没什么需要做的事情可以空不写内容。总体难度偏中等,需要考虑的情况虽然多但是都比较容易想到,主要还是代码实现上思维有局限。遍历顺序似乎没那么重要,个人用的后序,卡哥用的前序。

2024-05-10 11:10:55 481 1

原创 【算法训练 day23 二叉搜索树的最小绝对差、二叉搜索树的众数、二叉树的最近公共祖先】

本题比较巧妙,对各个情况处理比较特殊。

2024-05-09 15:51:37 657

原创 【算法训练 day22 最大二叉树、合并二叉树、二叉搜索树的搜索、验证二叉搜索树】

依然采取前序遍历,这样好理解一点,依次遍历两个树,如果节点都不为空节点,那就创建一个新结点然后返回,如果任意节点为空,返回另一个不为空的节点。这道题我开始想不通的地方在于:如果一个节点为空另一个节点不为空,按照思路应该返回另一个不为空的节点,但是这时我理解不了如果直接返回,另一个不为空的节点后还有孩子节点该怎么办。这道题比较坑的是,在实现递归验证时,只专注于单个子树的平衡,没有放大到整个二叉树,实现上需要保存每一层父节点的值,这样就保证整体都是平衡的。需要注意的是,数组边界需要前后一致,比如左开右闭。

2024-05-08 22:54:14 267 1

原创 【算法训练 day21 找树左下角的值、路径总和、从中序与后序遍历序列构造二叉树】

整体运用了二叉树深度的求法,以及回溯的思想。还是回溯加递归,不过函数返回值为bool类型,当不要返回具体路径时,函数返回值一般为bool类型,因为主要判断是否存在这么一条路径,给出是或者否即可。类似于113题需要你给出具体路径时,就不要返回bool,而是返回void,符合条件的路径保存在一个全局变量res中即可。题目也可以不用每递归一次创建四个数组,在函数参数处添加数组首尾下标即可。

2024-05-07 19:58:18 491 1

原创 【算法训练 day20 平衡二叉树、二叉树的路径、左叶子之和】

题目需要注意插入节点值这个操作需要放最上面,因为退出条件是遍历到叶子节点就插入res数组,这样可以避免没有插入path数组就直接将结果放到了res数组中;值拷贝的原因在于回溯思想,这样可以避免来回对path操作。需要注意的是,本体不仅需要判断是不是叶子节点还要判断是不是左叶子节点,所以不能用当前节点来判断,而需要借助父节点来判断。时间复杂度O(n^2),空间复杂度O(1)。

2024-05-06 15:29:58 276

原创 【算法训练 day19 二叉树的最大深度、二叉树的最小深度、完全二叉树的节点个数】

整体比较简单。题目需要注意的是,需要在递归体中来判断是不是叶子节点,如果不是叶子节点,那就取该节点两个子树中深度最小值的那棵,如果该节点为叶子节点,那就表明访问到树的底部,正常返回0即可,如果该节点不是叶子节点且左右子树中有一个为空,那就返回不为空的那一侧的值,这样就保证考虑到所有情况。简单题,加深对二叉树的遍历书写印象,以上三题使用层序遍历来做的话,都比较简单直接明了,递归绕了点。

2024-05-05 18:56:20 828

原创 【算法训练 day18 层序遍历、翻转二叉树、对称二叉树】

整体比较简单,需要注意每次插入数据时,需要提前判断队列中的元素个数,元素个数代表需要循环插入多少次的左右节点,队列弹出元素也需要放在最里面的循环中。题目既可以后序也可以先序遍历,这两种方法好理解一点,整体简单。该题需要注意,退出条件那里,为什么不用判断left->val == right->val,是因为如果判断值相等就返回true,会导致没有遍历完整个二叉树,也就是要考虑等于nullptr时才可以退出递归。

2024-05-04 18:00:17 338

原创 【算法训练 day14 二叉树的递归遍历】

二叉树递归遍历是基础,主要运用了栈的先进后出特性。

2024-04-30 10:46:13 198 1

原创 【算法训练 day13 滑动窗口的最大值、前k个高频元素】

一刷跳过,学习使用仿函数的使用以及容器适配器的使用。

2024-04-29 17:01:58 288

原创 【算法训练 day11 有效的括号、删除字符串中的所有相邻重复项、逆波兰表达式求值】

整体比较简单,需要注意各个陷阱案例,在if分支中尽量考虑到可能的情况。算法时间复杂度为O(n),空间复杂度为O(n)。题目需要删除的是相邻元素,类似于括号那题,需要配成一对的去考虑都可以用栈的思想,时间复杂度为O(n),空间复杂度为O(n),不使用栈情况下:时间复杂度为O(n),空间复杂度为O(1)。考验对栈的应用。时间复杂度O(n),空间复杂度O(n)。

2024-04-27 16:47:43 958

原创 【算法训练 day10 用栈实现队列、用队列实现栈】

非算法题,只是加深理解数据结构底层理解的题目。非算法题,只是加深理解数据结构底层理解的题目。

2024-04-26 14:29:09 514

原创 【算法训练 day9 KMP算法】

kmp算法需要多次理解,重点在于next数组存了什么,i指什么,j指什么。

2024-04-25 14:26:16 762 1

原创 【算法训练 day8 字符串】

整体简单,算法时间复杂度为O(n),空间复杂度为O(1)。简单题目,时间复杂度O(n),空间复杂度为O(1)。简单题目。时间复杂度O(n),空间复杂度O(n)或者O(1)。题目有一定难度,需要理清逻辑。时间复杂度为O(n),空间复杂度为O(1)。时间复杂度为O(n),空间复杂度为O(1)。

2024-04-24 20:58:35 1030 1

原创 【算法训练 day7 哈希表与双指针】

两数之和的进阶版,算法时间复杂度为O(n),空间复杂度为O(1)。简单题,时间复杂度O(n),空间复杂度为O(1)。题目是双指针的应用,要把握好外循环for是移动i指针,内循环while是移动left与right指针。本题考验对细节的的把握,什么时候移动左指针,什么时候移动右指针,以及避免多余判断进行剪枝。时间复杂度O(n^2),空间复杂度O(1)。三数之和的进阶版,算法时间复杂度为O(n^3),空间复杂度为O(1)。

2024-04-23 17:06:56 1000

原创 【算法训练 day6 哈希表】

涉及到类型以及类型的个数,优先考虑使用哈希表,算法时间复杂度为O(n),空间复杂度为O(1)。时间复杂度O(n+m),空间复杂度为O(n)。题目具有一定技巧性。时间复杂度O(logn),空间复杂度O(logn)。理解哈希表以及熟悉stl操作非常好的的一道题,常看常新。算法时间复杂度O(n),空间复杂度O(n)。

2024-04-22 16:30:00 824

原创 【算法训练 day4 两两交换链表中的节点、删除链表的倒数第N个节点、链表相交、环形链表Ⅱ】

整体比较简单,算法时间复杂度为O(n),空间复杂度为O(1)。题目有一定技巧性,时间复杂度O(n),空间复杂度为O(1)。题目具有一定技巧性。时间复杂度O(n+m),空间复杂度O(1)。题目具有一定的数学性,需要自己在纸上进行推导才能理解过程。

2024-04-20 16:15:00 955

原创 【算法训练 day3 移除链表元素、设计链表、反转链表】

整体比较简单,需要注意链表循环的退出条件以及删除节点后需要delete以及置空,避免出现未定义行为;删除节点后由于头节点可能被删除,所以返回时需要返回虚拟头节点的下一个节点,即vhead->next。链表的操作实现没有难点只有熟练度问题。总体简单,在单链表中,对链表的操作如果涉及删除添加,都需要有一个指针去指向需要操作节点的前一个节点,这样才能保证链表的连贯性。时间复杂度O(n),空间复杂度O(1)。

2024-04-19 12:57:18 952

原创 【算法训练 day2 有序数组的平方、长度最小的子数组、螺旋矩阵】

整体比较简单,需要注意数组的边界判断。算法时间复杂度为O(n),空间复杂度为O(1)。题目本质还是双指针的应用,外层for循环用来移动快指针,内层while循环用来移动慢指针,从而达到滑动窗口的效果。这里对元素只是加了一次与减一次的操作,并没有在while里对整个数组进行操作,所以复杂度为O(2n)也就是O(n),空间复杂度为O(1)。非算法题,考验对数组边界的判断以及对代码的掌控能力。时间复杂度O(n^2),空间复杂度O(1)。

2024-04-18 13:07:40 983

空空如也

空空如也

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

TA关注的人

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