- 博客(73)
- 资源 (1)
- 收藏
- 关注
原创 算法训练营 day64 单调栈 柱状图中最大的矩形 训练营完结!!!
给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1。求在该柱状图中,能够勾勒出来的矩形的最大面积。理解这一点,对单调栈就掌握的比较到位了。除了栈内元素顺序和接雨水不同,剩下的逻辑就都差不多了。
2023-03-01 18:59:45
329
3
原创 算法训练营 day63 单调栈 下一个更大元素II 接雨水
因为一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。取栈顶元素,将栈顶元素弹出,这个就是凹槽的底部,也就是中间位置,下标记为mid,对应的高度为height[mid](就是图中的高度1)。如果当前遍历的元素(柱子)高度等于栈顶元素的高度,要跟更新栈顶元素,因为遇到相相同高度的柱子,需要使用最右边的柱子来计算宽度。遇到相同的元素,更新栈内下标,就是将栈里元素(旧下标)弹出,将新元素(新下标)加入栈中。
2023-03-01 18:34:09
459
原创 算法训练营 day62 单调栈 每日温度 下一个更大元素 I
因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。这里我们要使用递增循序(再强调一下是指从栈头到栈底的顺序),因为只有递增的时候,栈里要加入一个元素i的时候,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i。栈头到栈底的顺序,要从小到大,也就是保持栈里的元素为递增顺序。即:如果求一个元素右边第一个更大元素,单调栈就是递增的,如果求一个元素右边第一个更小元素,单调栈就是递减的。
2023-03-01 17:51:13
517
原创 算法训练营 day60 动态规划 回文子串 最长回文子序列
给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。dp[i] 和 dp[i-1] ,dp[i + 1] 看上去都没啥关系。所以我们要看回文串的性质。
2023-03-01 17:50:23
425
原创 算法训练营 day59 动态规划 两个字符串的删除操作 编辑距离
给定两个单词word1和word2,返回使得word1和word2所需的。可以删除任意一个字符串中的一个字符。 这次是两个字符串可以相互删了,这种题目也知道用动态规划的思路来解,动规五部曲,分析如下:确定dp数组(dp table)以及下标的含义dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。这里dp数组的定义有点点绕,大家要撸清思路。确定递推公式当相同的时候当不相同的时候当相同的时候,;当。
2023-02-28 23:38:49
238
原创 算法训练营 day58 动态规划 判断子序列 不同的子序列
392. 判断子序列 - 力扣(LeetCode)给定字符串 s 和 t ,判断 s 是否为 t 的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。进阶:如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?确定dp数组(dp table)以及下标的含义表示以下标i-1为结尾的字符串s
2023-02-28 23:37:31
193
原创 算法训练营 day57 动态规划 最长公共子序列 不相交的线 最大子序和(动态规划)
给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。确定dp数组(dp table)以及下标的含义dp[i][j]
2023-02-27 18:55:56
243
原创 算法训练营 day56 动态规划 最长递增子序列 最长连续递增序列 最长重复子数组
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。dp[i]的定义本题中,正确定义dp数组的含义十分重要。状态转移方程位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);。
2023-02-27 18:53:51
182
原创 算法训练营 day55 动态规划 买卖股票问题系列3
保持卖出股票状态(状态二),这里其实从 「状态二」的定义来说 ,很难明确应该初始多少,这种情况我们就看递推公式需要我们给他初始成什么数值。最后结果是取 状态二,状态三,和状态四的最大值,不少同学会把状态四忘了,状态四是冷冻期,最后一天如果是冷冻期也可能是最大值。在来看看如果第i天不持有股票即dp[i][1]的情况, 依然可以由两个状态推出来。从递归公式上可以看出,dp[i] 依赖于 dp[i-1],所以是从前向后遍历。,例如今天买入股票、今天卖出股票、今天是冷冻期,都是不能操作股票的。
2023-02-24 22:54:34
518
原创 算法训练营 day53 动态规划 买卖股票的最佳时机系列2
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。一天一共就有五个状态,dp[i][j]中 i表示第i天,j为[0 - 4]五个状态,dp[i][j]表示第i天状态j所剩最大现金。dp[i][1]。达到dp[i][1]那么dp[i][1]究竟选,还是呢?一定是选最大的,所以;同理dp[i][2]所以;;;第0天做第一次买入的操作,;
2023-02-23 19:25:10
204
原创 算法训练营 day52 动态规划 买卖股票的最佳时机系列1
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0。确定dp数组(dp table)以及下标的含义dp[i][0] 表示第i天持有股票所得最多现金 ,dp[i][1] 表示第i天不持有股票所得最多现金确定递推公式如果第i天持有股票即dp[i][0]
2023-02-22 20:50:57
340
原创 算法训练营 day51 动态规划 打家劫舍系列
198. 打家劫舍 - 力扣(LeetCode)你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。确定dp数组(dp table)以及下标的含义dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。确定递推公式决定dp[i]的因素就是第i房间偷还是
2023-02-21 22:32:09
430
原创 算法训练营 day50 动态规划 单词拆分 多重背包理论基础
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。拆分时可以重复使用字典中的单词,说明就是一个完全背包!确定dp数组以及下标的含义。确定递推公式如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。(j < i )。
2023-02-20 20:46:55
394
原创 算法训练营 day49 动态规划 爬楼梯 (进阶)零钱兑换 完全平方数
假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?1阶,2阶,… m阶就是物品,楼顶就是背包。每一阶可以重复使用,例如跳了1阶,还可以继续跳1阶。问跳到楼顶有几种方法其实就是问装满背包有几种方法。确定dp数组以及下标的含义。确定递推公式本题呢,dp[i]有几种来源,dp[i - 1],dp[i - 2],dp[i - 3] 等等,即:dp[i - j]那么递推公式为:dp[i] += dp[i - j]dp数组如何初始化。
2023-02-19 23:00:09
627
原创 算法训练营 day48 动态规划 完全背包 零钱兑换 II 组合总和 Ⅳ
有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。,求解将哪些物品装入背包里物品价值总和最大。。在下面的讲解中,我依然举这个例子:背包最大重量为4。01背包和完全背包唯一不同就是体现在遍历顺序上,所以本文就不去做动规五部曲了,我们直接针对遍历顺序经行分析!我们知道01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的。
2023-02-15 15:49:28
275
原创 算法训练营 day46 动态规划 最后一块石头的重量 II 目标和 一和零
有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x
2023-02-14 21:29:10
315
原创 算法训练营 day45 动态规划 0-1背包理论 分割等和子集
首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0;在看其他情况。状态转移方程。
2023-02-13 18:33:00
326
原创 算法训练营 day44 动态规划 整数拆分 不同的二叉搜索树
给定一个正整数n,将其拆分为k个的和(k >= 2),并使这些整数的乘积最大化。返回你可以获得的最大乘积。确定dp数组(dp table)以及下标的含义dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。确定递推公式可以从1遍历j,然后有两种渠道得到dp[i].一个是j * (i - j) 直接相乘。一个是j * dp[i - j],相当于是拆分(i - j),对这个拆分不理解的话,可以回想dp数组的定义。j是从1开始遍历,拆分j的情况,在遍历j的过程中其实都计算过了。
2023-02-12 21:25:31
424
1
原创 算法训练营 day43 动态规划 不同路径 不同路径 II
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。想要求dp[i][j],只能有两个方向来推导出来,即和。此时在回顾一下表示啥,是从(0, 0)的位置到(i - 1, j)有几条路径,同理。那么很自然,,因为dp[i][j]只有这两个方向过来。
2023-02-12 14:53:05
884
原创 算法训练营 day41 贪心算法 单调递增的数字 买卖股票的最佳时机含手续费
当且仅当每个相邻位数上的数字 x 和 y 满足 x strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。。。。举个例子,数字:332,从前向后遍历的话,那么就把变成了329,此时2又小于了第一位的3了,真正的结果应该是299。
2023-02-09 19:43:45
262
原创 算法训练营 day39 贪心算法 无重叠区间 划分字母区间 合并区间
右边界排序之后,局部最优:优先选右边界小的区间,所以从左向右遍历,留给下一个区间的空间大一些,从而尽量避免交叉。全局最优:选取最多的非交叉区间。
2023-02-09 19:42:41
455
原创 算法训练营 day38 贪心算法 柠檬水找零 根据身高重建队列 用最少数量的箭引爆气球
在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。注意,一开始你手头没有任何零钱。给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false。
2023-02-08 23:06:22
111
原创 算法训练营 day37 贪心算法 K次取反后最大化的数组和 加油站 分发糖果
给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:选择某个下标 i 并将 nums[i] 替换为 -nums[i]。重复这个过程恰好 k 次。可以多次选择同一个下标 i。以这种方式修改数组后,返回数组 可能的最大和。
2023-02-08 23:04:39
302
原创 算法训练营 day36 贪心算法 买卖股票的最佳时机II 跳跃游戏 跳跃游戏II
122. 买卖股票的最佳时机 II - 力扣(LeetCode)给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。返回 你能获得的 最大 利润 。本题首先要清楚两点:选一个低的买入,再选个高的卖,再选一个低的买入…循环反复。如果想到其实最终利润是可以分解的,那么本题就很容易了!如何分解呢?假如第0天买入,第3天卖出,那么利润为:prices[3]
2023-02-07 19:30:36
145
原创 算法训练营 day34 回溯算法 重新安排行程 N皇后 解数独
因为解数独找到一个符合的条件(就在树的叶子节点上)立刻就返回,相当于找从根节点到叶子节点一条唯一路径,所以需要使用bool返回值。递归深度就是row控制棋盘的行,每一层里for循环的col控制棋盘的列,一行一列,确定了放置皇后的位置。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。确定完约束条件,来看看究竟要怎么去搜索皇后们的位置,其实搜索皇后的位置,可以抽象为一棵树。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
2023-02-06 19:00:27
307
原创 算法训练营 day32 回溯算法 递增子序列 全排列 全排列 II
给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。本题求子序列,很明显一个元素不能重复使用,所以需要startIndex,调整下一层递归的起始位置。本题其实类似求子集问题,也是要遍历树形结构找每一个节点,可以不加终止条件,startIndex每次都会加1,并不会无限递归。但本题收集结果有所不同,题目要求递增子序列大小至少为2在图中可以看出,
2023-02-06 18:56:48
326
原创 算法训练营 day31 回溯算法 复原IP地址 子集 子集II
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。
2023-02-04 23:07:47
642
原创 算法训练营 day30 回溯算法 组合总和 组合总和II 分割回文串
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target 的不同组合数少于 150 个。这里依然是定义两个全局变量,二维数组result存放结果集,数组path存放符合条件的结果。
2023-02-03 22:35:26
401
原创 算法训练营 day29 回溯算法 组合总和III 电话号码的字母组合
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:只使用数字1到9每个数字 最多使用一次返回 所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。做过之后,本题是简单一些了。回溯三部曲这里依然定义path 和 result为全局变量。所以如果path.size() 和 k相等了,就终止。如果此时path里收集到的元素和(sum) 和targetSum(就是题目描述的n)相同了,就用result收集当前的结果。
2023-01-30 14:27:08
209
1
原创 算法训练营 day24 回溯算法 回溯算法理论基础 组合
回溯法也可以叫做回溯搜索法,它是一种搜索的方式。。。,是的,我指的是所有回溯法的问题都可以抽象为树形结构!因为回溯法解决的都是在集合中递归查找子集,。递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。回溯函数模板返回值以及参数回溯函数终止条件回溯搜索的遍历过程。
2023-01-30 13:33:12
223
原创 算法训练营 day23 二叉树 修剪二叉搜索树 将有序数组转换为二叉搜索树 把二叉搜索树转换为累加树
修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。左右子树也必须是二叉搜索树。
2023-01-19 20:58:19
1736
原创 算法训练营 day22 二叉树 二叉搜索树的最近公共祖先 二叉搜索树中的插入操作 删除二叉搜索树中的节点
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。因为是有序树,所有 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。
2023-01-18 23:19:09
1400
原创 算法训练营 day21 二叉树 二叉搜索树的最小绝对差 二叉搜索树中的众数 二叉树的最近公共祖先
给你一个二叉搜索树的根节点root,返回。差值是一个正数,其数值等于两值之差的绝对值。
2023-01-17 18:15:12
580
原创 算法训练营 day20 二叉树 最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉树
给定一个不重复的整数数组 nums。最大二叉树 可以用下面的算法从 nums 递归地构建:创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。返回 nums 构建的 最大二叉树。最大二叉树的构建过程如下:构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点。
2023-01-16 18:56:11
533
原创 算法训练营 day18 二叉树 找树左下角的值 路径总和 从中序与后序遍历构建二叉树
给定一个二叉树的root,请找出该二叉树的节点的值。假设二叉树中至少有一个节点。
2023-01-14 18:00:48
784
原创 算法训练营 day17 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。
2023-01-13 21:00:21
308
原创 算法训练营 day16 二叉树 二叉树的最大深度 二叉树的最小深度 完全二叉树的节点个数
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。叶子节点是指没有子节点的节点。
2023-01-12 15:21:49
321
原创 算法训练营 day15 二叉树 层序遍历 翻转二叉树 对称二叉树
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。比较的是两个子树的里侧和外侧的元素是否相等。(即逐层地,从左到右访问所有节点)。需要借用一个辅助数据结构即队列来实现,,翻转这棵二叉树,并返回其根节点。给你一棵二叉树的根节点。给你一个二叉树的根节点。, 检查它是否轴对称。节点为空的情况有:(
2023-01-11 23:24:20
281
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人