
Leetcode刷题
Leetcode刷题记录
好像也没什么大不了
热爱生活,热爱你
展开
-
【20230606】【每日一题】不同的子序列
1.当s[i-1]==t[j-1]时,dp[i][j]可以由两种情况得到:一种是用s[i-1]来匹配,一种是不需要s[i-1]匹配,因为在这之前就已经有子序列出现了。当用s[i-1]来匹配时,数量为dp[i-1][j-1];当不用s[i-1]来匹配时,数量为dp[i-1][j];dp[i][j]:以i-1结尾的s子序列中出现以j-1结尾的t的个数。2.当s[i-1]!=t[j-1]时,只能不用s[i-1]来匹配了,题目数据保证答案符合 32 位带符号整数范围。初始化时:dp[i][0]=1。原创 2023-06-06 10:58:32 · 369 阅读 · 1 评论 -
【20230413】【每日一题】最大矩形
3.因此,遍历每一行时,都能够得到以这一行为底的带高度的数组;柱状图的最大矩形的扩展题,原创 2023-04-13 15:29:03 · 107 阅读 · 0 评论 -
【202304113】【每日一题】柱状图中最大的矩形
单调栈,维护一个单独递增的栈,只有放入元素比栈顶元素大才入栈,否则一直pop +计算最大面积。栈中初始化一个-1,数组的末尾添加一个元素0,这样才能计算所有的情况(或者说清空栈)。以2 1 5 6 2 3为例。原创 2023-04-13 11:32:34 · 112 阅读 · 0 评论 -
【20230407】【每日一题】编辑距离
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数。1.dp[i][j]]表示以下标i-1结尾的word1 和以下标j-1结尾的word2的最近编辑距离;2.确定递推关系式:一共有4种情况。注意这里的插入、删除、替换操作。插入可以看成是word2的删除。原创 2023-04-07 10:15:28 · 343 阅读 · 0 评论 -
【20230401】【每日一题】前K个高频元素
在STL中,默认情况下(不加后面两个参数)是以vector为容器,以 operator< 为比较方式,所以在只使用第一个参数时,优先队列默认是一个最大堆,每次输出的堆顶元素是此时堆中的最大元素。对于container,要求必须是数组形式实现的容器,例如vector、deque,而不能使list。堆是一颗完全二叉树,树中每个节点的值都不小于(或不大于)其左右孩子的值。大顶堆(堆头是最大元素) 小顶堆(堆头是最小元素)container:实现优先队列的底层容器;优先级队列:披着队列外衣的堆。原创 2023-04-01 13:54:50 · 270 阅读 · 0 评论 -
【20230329】【每日一题】最长公共子序列
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0。例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。原创 2023-03-29 17:20:41 · 117 阅读 · 0 评论 -
【20230328】【每日一题】最长重复子串
长度最长的子数组的长度。原创 2023-03-28 11:57:00 · 104 阅读 · 0 评论 -
【20230322】【每日一题】最长连续递增序列
连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l原创 2023-03-22 10:01:39 · 125 阅读 · 0 评论 -
【20230321】【每日一题】最长递增子序列
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。dp数组的含义:到下标i为止,以nums[i]结尾的最长递增子序列的长度。给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。以序列 0 1 0 3 2 为例。原创 2023-03-21 09:34:46 · 123 阅读 · 0 评论 -
【20230320】【每日一题】买卖股票的最佳时机含手续费
给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格;整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。返回获得利润的最大值。原创 2023-03-20 09:35:49 · 108 阅读 · 0 评论 -
【20230320】【每日一题】最佳买卖股票时机含冷冻期
设计一个算法计算出最大利润。冷冻期的由来:只能是两天前持有,一天前卖了(还是得和冷冻期的前一天状态比较)含有冷冻期,就在每天里加上冷冻期的状态。有三种状态:未持有、持有、冷冻期。另外,在初始化时,由于冷冻期的状态与两天前有关,所以初始化得初始化两天。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。持有的由来:延续上一天的持有/上一天是冷冻期今天又买了。未持有的由来:延续上一天的未持有/上一天持有今天卖了。原创 2023-03-20 09:23:17 · 117 阅读 · 0 评论 -
【20230317】【每日一题】买卖股票的最佳时机IV
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。与买卖股票3类似,3最多两笔,5个状态;这里k笔,那么设置2k+1个状态即可。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。设计一个算法来计算你所能获取的最大利润。递推关系式也可以在3种看出规律。你最多可以完成 k 笔交易。原创 2023-03-17 11:51:51 · 114 阅读 · 0 评论 -
【20230316】【每日一题】买卖股票的最佳时机III
/第二次持有依赖于前一天的第一次未持有的状态。dp[i][1]有两种来源:第i天买入了;第i天没买,i-1天时就持有了。给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。确定dp数组及其下标含义 :一天一共有五个状态。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。确定遍历顺序 从前往后。原创 2023-03-16 14:33:07 · 111 阅读 · 0 评论 -
【20230316】【每日一题】买卖股票的最佳时机
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。//到下标i未持有,有两种可能:1.下标i-1就未持有;2.i-1持有到i时卖了。//到下标i持有,有两种情况:1.下标i-1就持有;2.i-1未持有到i时买了。特别是i-1未持有,i时才买,由于本题只能买卖一次,所以直接-prices[i]就行。返回你可以从这笔交易中获取的最大利润。原创 2023-03-16 13:28:10 · 119 阅读 · 0 评论 -
【20230314】【每日一题】打家劫舍III
在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。:下标为0记录不偷该节点所得最大金钱,下标为1记录偷该节点所得最大金钱。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。一个节点偷与不偷的两个状态,返回值是一个长度为2的数组。确定递归函数的参数和返回值。dp数组及其下标的含义。原创 2023-03-14 15:42:21 · 131 阅读 · 0 评论 -
【20230209】【每日一题】两个数组的交集II
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。(其实当时最直观的想法是用multiset)的区别是:有没有重复元素插入。原创 2023-02-09 14:48:53 · 105 阅读 · 0 评论 -
【20230208】【每日一题】字母异位词分组
对字符串进行排序的作用:如果为“adc”,排序后则变为“acd”,于是便可以将属于同一组的所有值都将映射到同一组中。字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。通过设计哈希表中的键值进行归类(将相同键值的字符串都push到容器中便于后面单独取出)给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。原创 2023-02-08 13:37:18 · 80 阅读 · 0 评论 -
【20221226】【每日一题】打家劫舍II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。思路:与打家劫舍的区别是成环了,多了首尾需要特殊考虑的情况。原创 2022-12-26 18:11:27 · 104 阅读 · 0 评论 -
【20221225】【每日一题】打家劫舍
每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。偷的话,dp[i-2]+nums[i] 不偷的话 dp[i-1];给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。3、初始化:dp[0]=nums[0] ,dp[1]=max(nums[0],nums[1]);1、dp数组下标及其含义:房屋编号i以内的房屋,最多偷窃金额为dp[i];原创 2022-12-25 13:52:15 · 96 阅读 · 0 评论 -
完全背包理论基础
有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。 打印的dp数组:原创 2022-12-24 11:12:08 · 80 阅读 · 0 评论 -
【20221223】【每日一题】单词拆分
2、递推关系式:如果(i,j)区间里的单词在字典中出现了,那么dp[j]为true,并且要求i处时也能组成,即为true;给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s。1、dp数组下标及其含义:长度为j的字符串,能否由字典内组成为dp[j];注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。4、遍历顺序:完全背包问题,排序问题,先背包(正序)后物品;3、初始化:dp[0]=true,其他为false;原创 2022-12-23 19:19:14 · 250 阅读 · 0 评论 -
【20221218】【每日一题】完全平方数
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。1、dp数组下标及其含义:背包容量为j的背包装满,最少需要元素数目dp[j];2、递推关系式:dp[j]=min(dp[j],dp[j-i*i]+1);给你一个整数 n ,返回 和为 n 的完全平方数的最少数量。4、遍历顺序:完全背包问题,先物品,再背包,背包正序;3、初始化:dp[0]=0,其余均为INT_MAX;5、举例验证dp数组。原创 2022-12-18 22:28:57 · 196 阅读 · 0 评论 -
【20221217】【每日一题】零钱兑换
计算并返回可以凑成总金额所需的 最少的硬币个数。给你一个整数数组 coins ,表示不同面额的硬币;3、初始化:dp[0]=0,其余均为最大值,INT_MAX,因为每次都要比较一下取最小值;2、递推关系式:dp[j]=min(dp[j-coins[i]]+1,dp[j]);1、dp数组下标及其含义:背包容量为j的背包装满所用元素的最小值为dp[j];4、遍历顺序:完全背包问题,所求为组合,所以先 物品再背包,背包为正序;思路:如果dp[j-coins[i]]为初始值,则跳过。5、举例验证dp数组。原创 2022-12-17 10:56:46 · 208 阅读 · 0 评论 -
【20221215】【每日一题】爬楼梯进阶(ACM模式)
1、getline使用方法:getline(,,)4、遍历顺序:归根到底还是排序问题,不同的顺序可以视为不同的方法,先背包后物品,背包为正序。在爬楼梯的基础上,改为一次可以爬1阶、2阶、...一直到m阶,问一共有多少种办法爬到楼顶?2、递推关系式:背包装满的问题、dp[j]+=dp[j-nums[i]];思路:这是一个完全背包问题,因为爬完一阶后,还可以再爬一阶,可以重复取;1、dp数组下标及其含义:背包容量为j的背包一共有dp[j]种办法装满;原创 2022-12-15 14:10:12 · 676 阅读 · 0 评论 -
【20221214】【每日一题】组合总和IV
给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target。请你从 nums 中找出并返回总和为 target 的元素组合的个数。4、遍历顺序:由于要求为装满背包的最大排列数量,所以先背包,再物品。1、dp数组下标及其含义:背包容量为j的背包最多有dp[j]种装满方式(排列形式);出现这个错误,所以加上一个判断语句,防止dp[j]超过int可以表示的最大范围。2、递推关系式:(装满背包的方式)dp[j]+=dp[j-nums[i]];3、初始化:dp[0]为1,其余为0;原创 2022-12-14 22:36:48 · 167 阅读 · 0 评论 -
【20221213】【每日一题】零钱兑换II
纯完全背包求得装满背包的最大价值是多少,和凑成总和的元素有没有顺序没关系,即:有顺序也行,没有顺序也行!给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。2、递推关系式:(求装满背包的方法)dp[j]+=dp[j-coins[i]];1、dp[j]数组的下标及其定义:背包容量为j的背包最多有dp[j]种装法;3、dp数组的初始化:dp[0]=1,其他均为0;假设每一种面额的硬币有无限个。4、遍历顺序:先物品,再背包;原创 2022-12-13 16:33:26 · 324 阅读 · 0 评论 -
完全背包理论基础
完全背包与01背包的区别是:完全背包每个物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包内,总价值最大。01背包--内层的循环是从大到小的倒序遍历,这样做的目的是为了让每个物体仅被添加一次;完全背包--由于物品是可以多次添加的,所以内层的循环仍然从小到大进行遍历。原创 2022-12-13 16:01:59 · 109 阅读 · 0 评论 -
【20221212】【每日一题】一和零
2、递推关系式:dp[i][j] 可以由前一个strs里的字符串推导出来,strs里的字符串有zeroNum个0,oneNum个1。dp[i][j] 就可以是 dp[i - zeroNum][j - oneNum] + 1。对比一下就会发现,字符串的zeroNum和oneNum相当于物品的重量(weight[i]),字符串本身的个数相当于物品的价值(value[i])。此时大家可以回想一下01背包的递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);原创 2022-12-12 19:47:04 · 295 阅读 · 0 评论 -
【20221208】【排序专题】
快速排序又是对冒泡排序的一种改进方法,在冒泡排序中,进行元素的比较和交换是在相邻元素之间进行的,元素每次交换只能移动一个位置,所以比较次数和移动次数较多,效率相对较低。而在快速排序中,元素的比较和交换是从两端向中间进行的,较大的元素一轮就能够交换到后面的位置,而较小的元素一轮就能交换到前面的位置,元素每次移动的距离较远,所以比较次数和移动次数较少,速度较快,故称为“快速排序”。上面第一轮比较完,我们可以看到最大的数5已经被放在了最端,此时我们只需要将去掉最大的数的那部分(2,3,1,4)进行重复的操作。原创 2022-12-08 21:31:54 · 315 阅读 · 0 评论 -
【20221208】【每日一题】目标和
思路:分成两组left与right,不变的是:left+right=sum,left-right=target,那么left=(sum+target)/2,此时问题转为用nums装满背包容量为left的背包最多有多少种方法?例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1"。1、dp数组的定义:容量为j的背包最多有dp[j]种方法;4、遍历顺序:滚动数组,物品在前,背包在后,为倒序;3、初始化:dp[0]=1,其他为0;原创 2022-12-08 20:05:41 · 540 阅读 · 0 评论 -
【20221207】【每日一题】最后一块石头的重量II
有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x原创 2022-12-07 17:33:49 · 158 阅读 · 0 评论 -
【20221207】【每日一题】分割等和子集
给你一个 只包含正整数 的 非空 数组 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。思路:将数组分割成相等的两个子集,也就是说在数组中任意取如果能取到和为sum/2,则表示可以分。用01背包的概念等价:1、dp数组的下标及其意义:dp[j]表示目标和为j时此时的和为dp[j];2、递推关系式:和滚动数组类似,dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);3、初始化:nums[i]均为大于0的数,所以都初始化为0即可;4、遍历顺序:先物品,再背包,注原创 2022-12-07 16:55:35 · 162 阅读 · 0 评论 -
【20221206】【每日一题】01背包的基础
思路:动规五部曲1、确定dp数组以及下标含义:二维数组dp[i][j]表示从下标为0-i的物品里任意取,放入容量为j的背包,价值总和最大为多少;2、确定递推关系式:从两个方向推dp[i][j],没放物品i以及放了物品i。没放物品i,由dp[i-1][j](当物品i的重量大于背包j的重量时,物品i无法放进背包中,所以被背包内的价值依然和前面相同),放了物品i,由dp[i-1][j-weight[i]]+value[i],也就模拟了物品i放入后得到的价值。因此递推关系式为:dp[i][j]=max(dp[i-原创 2022-12-06 20:22:09 · 252 阅读 · 0 评论 -
【20221205】【每日一题】寻找峰值
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于2.假设 nums[-1] = nums[n] = -\infty−∞3.对于所有有效的 i 都有 nums[i] != nums[i + 1]4.你可以使用O(logN)的时间复杂度实现此问题吗?数据范围:1 \le nums.length \le 2\times 10^5 \1≤nums.length≤2×105 -2^原创 2022-12-05 21:18:08 · 309 阅读 · 0 评论 -
【20221205】【每日一题】不同的二叉搜索树
给你一个整数 ,求恰由 个节点组成且节点值从 到 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 思路:以n=3为例,当主节点为1时,左孩子无,右孩子有两个节点,于是为dp[0]*dp[2]; 当主节点为2时,左右孩子都只有一个节点,dp[1]*dp[1]; 当主节点为3时,右孩子无,左孩子有两个节点,于是dp[2]*dp[0]。最后将这些相加便是dp[3]。原创 2022-12-05 20:34:32 · 151 阅读 · 0 评论 -
【20221204】【每日一题】整数拆分
给定一个正整数 ,将其拆分为 个 正整数 的和( ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。思路:有个结论,尽可能的拆成3,可以让乘积最大(最后剩余4的时候不再拆成3和1)如果用动态规划的思路:递推公式 dp[i] =max(dp[i],max((i-j)*j,dp[i-j]*j))。原创 2022-12-04 15:11:51 · 375 阅读 · 0 评论 -
【20221204】【每日一题】监控二叉树
给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。思路: 1、要尽可能的少安装摄像头,那么摄像头不可能安装在叶子节点上,从叶子节点开始从下往上遍历,用左右中的后序遍历方式; 2、每个节点有3种状态,无覆盖、有摄像头、有覆盖,分别设为0、1、2; 3、确定好遍历顺序后,终止条件,如果遇到空节点,则默认为有覆盖; 4、单层逻辑:对左右孩子的状态进行判断,来确定父节原创 2022-12-04 14:27:58 · 434 阅读 · 0 评论 -
【20221202】【每日一题】单调递增的数字
观察如果为98,则从不递增的地方开始,9--,把8变为9即可;如果为100,从不递增的地方开始是1,把1变成0,后面的均变为9。这样才能获得最大的数,不然就只能变成90,而实际应该为99。当且仅当每个相邻位数上的数字 x 和 y 满足 x原创 2022-12-02 17:39:35 · 103 阅读 · 0 评论 -
【20221201】【每日一题】合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。原创 2022-12-01 20:23:28 · 98 阅读 · 0 评论 -
【20221201】【每日一题】划分字母区间
给你一个字符串 s。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s。返回一个表示每个字符串片段的长度的列表。原创 2022-12-01 20:05:22 · 562 阅读 · 0 评论