C++算法题解
文章平均质量分 54
旧事情稠
在读大学,对算法感兴趣
展开
-
代码随想录算法训练营第五十九天|LeetCode503. 下一个更大元素 II、LeetCode42. 接雨水
【代码】代码随想录算法训练营第五十九天|LeetCode503. 下一个更大元素 II、LeetCode42. 接雨水。原创 2023-07-07 18:53:44 · 187 阅读 · 0 评论 -
代码随想录算法训练营第五十七天|LeetCode647. 回文子串、LeetCode516. 最长回文子序列
dp[i][j]表示区间为i、j的字符串中最长回文序列的长度。dp[i][j]表示区间i、j的字符串是否是回文。跟上道题一样从下到上、从左到右。从下到上,从左到右;原创 2023-07-05 20:09:14 · 113 阅读 · 0 评论 -
代码随想录算法训练营第五十六天|LeetCode583. 两个字符串的删除操作、LeetCode72. 编辑距离
dp[i][j]表示下标i-1之前的字符串word1通过增、删、替换,改变成下标为j-1之前的字符串word2所需的最少步骤。dp[i][j]表示下标为i-1之前的word1字符串和下标为j-1之前的word2字符串相同所需删除字符的最小操作步骤。由递推公式可知,dp[i][j]依赖于dp[i-1][j]、dp[i][j-1]和dp[i-1][j-1]。从上到下,从左到右。原创 2023-07-04 11:15:22 · 180 阅读 · 0 评论 -
代码随想录算法训练营第五十五天|LeetCode392. 判断子序列、LeetCode115. 不同的子序列
2、递推公式:if(t[i - 1] == s[j - 1])dp[i][j] = dp[i - 1][j - 1];dp[i][j]表示下标为i - 1之前的序列s和下标为j - 1之前的序列t的最长公共子序列的长度。判断s是否是t的子序列,只需求出他们的最长公共子序列的长度,如果等于s的长度就说明s是t的子序列。dp[i][j]表示下标为i-1的s之前的序列中出现的下标为j-1的t之前的子序列的个数。原创 2023-07-03 08:48:43 · 143 阅读 · 0 评论 -
代码随想录算法训练营第五十二天|LeetCode300. 最长递增子序列、LeetCode674. 最长连续递增序列
2、递推公式:if(nums[i] > nums[i - 1]) dp[i] = dp[i - 1] + 1;1、dp数组下标及其含义:dp[i]表示以nums[i]为结尾的递增子序列的最大长度。1、dp数组及含义:dp[i]表示,以nums[i]为结尾的最长连续递增子序列的长度。3、初始化:vectordp(nums.size(), 1);3、初始化,vectordp(nums.size(), 1);4、遍历顺序:先从小到大遍历nums,再遍历i之前的子序列。4、遍历顺序:下标一开始,从小到大遍历。原创 2023-06-30 14:03:12 · 135 阅读 · 0 评论 -
代码随想录算法训练营第五十一天|LeetCode309. 最佳买卖股票时机含冷冻期、LeetCode714. 买卖股票的最佳时机含手续费
我们给它设有四个状态,dp[i][0]:持有股票的状态,dp[i][1]:保持卖出股票的状态,dp[i][2]:卖出股票的状态,dp[i][3]:冷冻期。1、dp数组及下表含义:dp[i][0]表示第i天持有股票是的利润。dp[i][1]表示第i天不持有股票时的利润。遍历顺序:从第一天开始,从小到大遍历每天股票的价格。设置股票持有和不持有两种状态。从下标一开始,从小到大遍历。原创 2023-06-29 08:47:50 · 118 阅读 · 0 评论 -
代码随想录算法训练营第五十天|LeetCode123. 买卖股票的最佳时机 III、LeetCode188. 买卖股票的最佳时机 IV
如果不看题解感觉还是很困难的!原创 2023-06-28 08:23:40 · 131 阅读 · 0 评论 -
代码随想录算法训练营第四十九天|LeetCode121. 买卖股票的最佳时机、LeetCode122. 买卖股票的最佳时机 II
2、递推公式:用一个整数low来记录当天之前最低的股票价格,则dp[i] = max(dp[i - 1], prices[i] - low),low = min(low, prices[i])。所以只需遍历所有的股票价格,比较相邻两只股票,如果有利润则加在总利润里就可以了。这道题很简单,如果后一天的股票加格大于前一天的价格,那么就可以获得利润。1、dp数组及其下标含义:dp[i]表示第i天所能收获的最大利润。3、初始化,dp[0] = 0, low = prices[0]。5、打印dp数组检查。原创 2023-06-27 07:48:06 · 107 阅读 · 0 评论 -
代码随想录算法训练营第四十八天|LeetCode198. 打家劫舍、LeetCode213. 打家劫舍 II、LeetCode337. 打家劫舍 III
3、初始化:dp[0] = nums[0], dp[1] = max(nums[0], nums[1])所以dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])。1、确定dp[i]数组及其下标含义。dp[i] 表示到地i个房间所能偷到的最多金额。1、考虑头不考虑尾,2、考虑尾不考虑头。(1)偷第i的房间:则dp[i] = dp[i - 2] + nums[i]。(2)不偷第i个房间:则dp[i] = d[i - 1]。2、不偷当前节点,则取左右子节点偷与不偷的最大值相加。原创 2023-06-26 10:14:27 · 168 阅读 · 0 评论 -
代码随想录算法训练营第四十六天|LeetCode 139. 单词拆分
2、递推公式:if(set.find(s.sbustr(j, i - j))!字符串i~j出现在字典里,并且dp[j] = true。1、dp[i]数组几下标含义:dp[i] = true 表示长度为i的字符串可以拆分为一个或多个单词。3、初始化:dp[0] = 1,表示空字符串出现在字典里。4、遍历顺序:先遍历字符串,再遍历可以分割的单词。将字典中的单词用来创建set哈希表。原创 2023-06-26 08:01:51 · 150 阅读 · 0 评论 -
代码随想录算法训练营第四十五天|LeetCode70. 爬楼梯、LeetCode322. 零钱兑换、LeetCode279. 完全平方数
我们可以将小于等于n的完全平方数全都放进一个数组sqr当作是物品。然后用n表示背包容量。则可以有以下解法:1、dp数组及下标定义:dp[j]表示能组成数j的完全平方数个数。2、递推公式:dp[j] = min(dp[j], dp[j - sqr[i]]+1)。3、初始化:vectordp(n + 1, INT_MAX),dp[0] = 0。4、遍历顺序:先遍历数组sqr,在遍历总和。原创 2023-06-24 08:12:09 · 184 阅读 · 0 评论 -
代码随想录算法训练营第四十四天|LeetCode518. 零钱兑换 II、LeetCode377. 组合总和 Ⅳ
完全背包问题,不同物品的个数是无限个。原创 2023-06-23 11:48:20 · 124 阅读 · 0 评论 -
代码随想录算法训练营第四十三天|LeetCode1049. 最后一块石头的重量 II
题目链接:1049. 最后一块石头的重量 II用背包问题的解题方法去解决。首先求出石头的总重量sum,然后用它长度和sum/2去创建一个二维数组,即dp[stones.size()][sum/2];i ++) {递推公式:dp[i][j]由两个方向推到过来,即dp[i -1][j]和dp[i - 1][j - stones[i]] + stones[i]。原创 2023-06-21 18:03:11 · 177 阅读 · 0 评论 -
代码随想录算法训练营第四十二天|LeetCode416. 分割等和子集
分割子集。原创 2023-06-20 09:14:17 · 120 阅读 · 0 评论 -
代码随想录算法训练营第四十一天|LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树
我们用一个一维数组dp[i] 来存放整数i拆分相乘得到的最大数。然后初始化dp[2] = 1,因为1和0不能拆分所以dp[0]和dp[1]没有意义。随后利用for循环从3开始,依次得到dp[3]~dp[n]的大小。对于每个i嵌套一个循环来遍历它拆得的一个数j,如果拆分成两个数就是j和i - j,相乘即是j * (i - j),如果拆分成三个或三个以上就是j * dp[i - j](因为dp[i]的定义就是拆分i相乘得到的最大数),于是dp[i] 就要从j*(i - j)和j * dp[i - j]当中原创 2023-06-19 11:54:57 · 108 阅读 · 0 评论 -
代码随想录算法训练营第三十九天|LeetCode62. 不同路径、LeetCode63. 不同路径 II
总以为动态规划会很难,没想到只要掌握了卡哥的动态规划五步曲还是可以自己解决很多题目的!动态规划五部曲:1、确定dp数组(dp table)以及下标的含义。2、确定递推公式3、dp数组的初始化4、确定遍历顺序5、举例推导dp数组原创 2023-06-17 08:10:15 · 609 阅读 · 0 评论 -
代码随想录算法训练营第三十八天|LeetCode509. 斐波那契数、LeetCode70. 爬楼梯、LeetCode746. 使用最小花费爬楼梯
最小花费爬楼梯:这道题我们要用dp[i]记录到达第i个阶梯时所需花费的最小值。首先我们要对前两个阶梯进行初始化:dp[0] = cost[0], dp[1] = cost[1]。随后从第三个阶梯开始,到达每个阶梯的最小花费为,前两个阶梯当中的最小值加上cost[i]。最后因为要跳到楼顶,我们可以从最后一阶台阶直接跳一步到达,也可以从倒数第二阶台阶跳两步到达,所以我们取这两种情况当中的最小值。原创 2023-06-16 09:07:23 · 108 阅读 · 0 评论 -
代码随想录算法训练营第三十七天|LeetCode738. 单调递增的数字、LeetCode968. 监控二叉树
这道题如果用暴力算法对小于等于目标数的每个整数进行一一判断的话就很花费时间很可能会超时。所以我们把整数转化成字符串,然后依次从后往前对每个字符进行处理。首先我们比较后面两个字符,如果靠后的字符ASC码值小于靠前的字符,说明这个数字非递增,这时需要靠前的字符减一,这时整数上高位就减一了,那么低位都需要变为最高数9这样才能保证数是最大值。然后再依次向前判断是否递增。原创 2023-06-15 12:32:37 · 154 阅读 · 0 评论 -
代码随想录算法训练营|LeetCode435. 无重叠区间、LeetCode763. 划分字母区间、LeetCode56. 合并区间
这道题可以用两个哈希表来解决。一张map哈希表用来记录原字符串中每个字符出现的个数,另一张set哈希表用来记录每个片段中出现过的字符。每遇到一个字符就用set先将它记录下来然后让map中的这个字符个数减一,如果map中这个字符的个数减为0时说明后面的字符串中也不会再出现这个字符,所以可以在记录片段字符出现过的set哈希表中将它移除,这时如果set的大小为0,说明前面一段字符串中出现过的所有的字符在后面的字符串中都不会再出现,所以只需将前面一段的字符个数记录下来放进结果集就可以了。原创 2023-06-14 16:58:32 · 58 阅读 · 0 评论 -
代码随想录算法训练营第三十五天|LeetCode860. 柠檬水找零、LeetCode406. 根据身高重建队列、LeetCode452. 用最少数量的箭引爆气球
因为顾客付的帐只会有三种情况,5、10、20,所以如果找零只会找5、10的钱。那么我们就需要记录一下5、10面值的钱的个数,找零的情况只有两种:顾客付账10或20。顾客付账10时,需要手里的5个数大于0,如果顾客付账20,手里的至少需要一张10和一张5,或者三张5。因为要考虑到后面顾客有较多付账10的情况,所以每次应尽量找10和5这种,才能留下来最多的5一边后面为10找零。原创 2023-06-13 16:44:09 · 137 阅读 · 1 评论 -
代码随想录算法训练营第三十四天|LeetCode1005. K 次取反后最大化的数组和、LeetCode134. 加油站、LeetCode135. 分发糖果
我们首先要对绝对值最大的负数进行取反,才能保证总和是最大的,那么我们就可以让数组按照绝对值大小进行排序。如果所有的负数都处理完后k依旧大于0,那么我们就要对绝对值最小的数进行k次取反(这样如果取到负数,我们的总和依旧是最大的),不过这里我们可以化简一下,如果k%2等于1的话只需对该数取一次反就可以了,否则不需要进行任何处理。原创 2023-06-12 09:28:01 · 129 阅读 · 0 评论 -
代码随想录算法训练营第三十一天|LeetCode122. 买卖股票的最佳时机 II、LeetCode55. 跳跃游戏、LeetCode45. 跳跃游戏 II
题目给出某只股票连续天的价格,且可以在同一天购买和抛售。那么要求最大的利润只需要比较相邻的价格,后面的价格比前面的价格高就有利润,只需依次加上可得利润的相邻股票价格之差就可以了(后面减去前面需是正数)。原创 2023-06-10 11:19:16 · 105 阅读 · 0 评论 -
代码随想录算法训练营第二十九天|LeetCode 491.递增子序列、LeetCode46.全排列、LeetCode47.全排列 II
题目要求找出并返回所有该数组中不同的递增子序列,且所给的数组中的元素是可能重复的。那么在使用递归和回溯来寻找时,我们要进行树层上的去重操作(树枝上并不需要去重),我们可以创建一个不可重复的哈希表set来标记树层上每个元素是否出现过,然后实现去重。而且因为递增子序列中至少有两个元素,所以我们在路径数组的大小大于1的时候才能收集有效子集。原创 2023-06-07 09:19:54 · 113 阅读 · 0 评论 -
代码随想录算法训练营第二十八天|LeetCode 93.复原IP地址、LeetCode 78.子集、LeetCode90.子集II
这道如果没学会“树层去重”和“树枝去重”的话还是比较困难的。因为数组中有出现重复的数值,所以如果按照[78.子集](https://leetcode.cn/problems/subsets/)的方法去接的话会出现循环层上(也就是树层)的重复记录,导致后面的子集重复,当然如果在递归层上(树枝)是可以重复的。因此我们要标记一下当前的数是否在这层前面是否已经出现过。我们用一组布尔类型的数组来记录,false表示该数在当前树层出现过,true表示该数在当前树枝上出现过。原创 2023-06-06 20:07:00 · 167 阅读 · 1 评论 -
代码随想录算法训练营第二十七天|LeetCode39. 组合总和、LeetCode40.组合总和II、LeetCode131.分割回文串
分割回文串这道题还是比较难的,而且同样要用递归和回溯。比较困难的是不容易对字符串的分割区间进行处理,而且还要判断区间内的字符串是否是回文。我们先来处理单层递归逻辑,这里我们要用到传进来的参数(切割的起始位置),然后用for循环依次列举切割的末尾,每次循环,要判断切割区域内的字符串是否是回文(这里可以另写一个函数来判断回文,也可以直接再里面判断),如果不是回文的话就继续下一个i的循环,如果是,就要把该回文放进方案路径里面,然后递归下一个回文的切割(切割点的起始位置为i+1),当然递归之后还要进行回溯。原创 2023-06-05 13:44:19 · 200 阅读 · 0 评论 -
代码随想录算法训练营第二十五天|LeetCode 216.组合总和III 、LeetCode17.电话号码的字母组合
电话号码字母组合:可以先用一个长度为8的字符串数map组列举出电话按键2-9数字所包含的字符。然后时经典的递归和回溯,路径要用一个字符串来表示,结果集用一个字符串数组,递归结束条件:路径的长度等于题目给的degits字符串长度,结束时将路径存放入结果集。每次递归遍历map字符串数组中的某个字符串,然后将字符串中的每个字符依次放入路径当中,递归完后回溯的时候才收回。可以用路径path的长度来表示当前遍历到digist中的第几个数字字符,再用这个数字字符减去‘2’,可以作为下标访问map中的某个字符串。原创 2023-06-03 11:05:41 · 94 阅读 · 0 评论 -
代码随想录算法训练营第二十四天|LeetCode 77. 组合
每次递归时用一个for循环取遍所有有效的数字,同时递归下一位,递归完之后回溯时要记得删掉最后一个数。每次递归用一个一维数组存放每条路径,满足递归结束条件(数组长度等于规定长度)后用一个二维数组存放所有的结果集。原创 2023-06-02 17:19:40 · 163 阅读 · 0 评论