Leetcode刷题
文章平均质量分 59
Kerin637
这个作者很懒,什么都没留下…
展开
-
剑指 Offer II 094. 最少回文分割 (dp)
题目链接class Solution {public: int minCut(string s) { //先预处理出s的每个子串是否为回文字符串 int n=s.size(); vector<vector<bool> > f(n,vector<bool>(n,true)); for(int i=n-1;i>=0;i--){ for(int j=i+1;j<n;原创 2022-05-02 08:24:39 · 207 阅读 · 0 评论 -
关于java的疑问记录
做俄罗斯套娃的时候,先按照w升序排列,再按照h降序排列,理论上按照h求LIS就可以了,但是遇到的问题是把envelops重新定义为Integer类型,dp时单纯比较h维度不行,还必须加上w维度的比较才能对一个测试样例得到正确的答案,而如果直接用int类型的envelops,dp只比较h就能得到正确的答案,不知道原因出在哪qvq不行的代码:class Solution { class cmp implements Comparator<Integer[]>{ publi原创 2022-04-15 09:05:36 · 313 阅读 · 0 评论 -
Leetcode_241. 为运算表达式设计优先级(记忆化搜索)
题目链接添加链接描述class Solution {public: map<string,vector<int> > mp; //遇到算符将表达式分成两部分,分别dfs两部分,dfs返回的结果是子问题所有可能的答案,两个答案容器进行组合就是最终的结果 //利用map来记录子问题的答案容器,遇到相同的子问题直接返回,记忆化搜索 vector<int> dfs(string exp){ if(mp.find(exp)!=原创 2022-03-28 10:03:25 · 162 阅读 · 0 评论 -
leetcode_1109. Corporate Flight Bookings (差分+前缀和)
题目链接上来先来一手暴力,毫无疑问TLE,于是学习官方解答。这道题其实就是对某个区间实施一个增量,然后这些增量可以累加,最后输出增加完增量之后的数组。如果使用for循环遍历这个区间,为每一个位置添加增量,是线性的时间复杂度,如果有很多区间,就变成O(n2)O(n^2)O(n2)了.以下主要参考官方解答:差分数组对应的概念是前缀和数组,对于数组[1,2,2,4],其差分数组为 [1,1,0,2],差分数组的第 i 个数即为原数组的第 i 个元素-第 i-1个元素的值,对差分数组求前缀和即可得到原原创 2021-08-31 09:48:37 · 133 阅读 · 0 评论 -
Leetcode_1289. 下降路径最小和 II
题目链接时间复杂度为 O(n3)O(n^3)O(n3) 的dp还是很容易写出来的,能优化的地方就是记录好上一行的最小值和次小值,这样下一行用到的时候可以O(1)的获取到,从而将总时间复杂度降低为O(n2)O(n^2)O(n2) ,这里想记录一下记录最小值和次小值下标的方法,感觉可以当板子记下来,参考三叶姐的题解for循环中枚举j,当前值就是dp[0&1][j],i1=-1就用MAX和当前值比,不为-1就用极小值dp[0&1][i1]来比,比极小值小的话再动用次极小值的比较,更新极小值下原创 2021-08-16 17:58:11 · 90 阅读 · 2 评论 -
Leetcode_526. 优美的排列
题目链接这道题用dfs写还是很快的,而且效率也挺高的,主要想记录一下状态压缩+dp的方法。状态压缩其实就是用二进制表示可能的状态,用mask表示状态,最多有1<<n种状态,第i位(从0开始)为1表示选取了数字i+1,设num(mask)表示mask二进制表示中1的个数,那么f(mask)就是表示排列中前num个位置选用第i位为1对应数字后满足题目两个求余条件之一的组合数目,那么f(mask)可以由比他二进制中1数目少一个的状态转移过来,这些满足条件的子状态相加就是f(mask)对应的方案数原创 2021-08-16 09:56:54 · 142 阅读 · 0 评论 -
Leetcode_931. 下降路径最小和
题目链接状态转移方程很好建立,只是想记录一下利用滚动数组来优化空间,其实就是把dp二维数组的第一维换为2,且后面代码中dp[i][j]中带i的位置换为i&1,相当于轮换使用dp[0][]和dp[1][]了,从三叶姐这里学的,感谢嘿嘿最后那个dp[n][j]循环要相应变为dp[n&1][j],虽然第一次没犯错,总觉得改滚动数组时这里会容易漏掉。完整代码:class Solution {public: int minFallingPathSum(vector<vec原创 2021-08-15 23:09:19 · 88 阅读 · 0 评论 -
Leetcode_233. Number of Digit One
题目链接连提示都提示要注意溢出,所以还是记得用long long难得独立做出来一道“困难”题,总要记录一下qwq我的思路和下述思路相同,所以直接引用人家的语言记录吧发现规律的过程是首先想到对每一位有多少1进行统计,判断每一位有多少1时,一开始只考虑了高位的情形,笼统的认为贡献了(高位+1)*base, 如11111,判断百位多少个1就是(11+1)*100,之所以+1是考虑到从0到11变化是12个100,但是多举几个例子后发现这个+1并不是总成立,因此想到了还需要看低位,事实上这个+1也是低位贡献原创 2021-08-13 11:26:00 · 91 阅读 · 0 评论 -
Leetcode_516. 最长回文子序列
题目链接刚看了《算法笔记》上的最长回文子串问题,于是模仿着来解决这个最长回文子序列的问题。设dp[i][j]表示s[i]到s[j]中最长回文子序列的长度边界条件 :dp[i][i]=1状态转移方程:考虑s[i]是否等于s[j],若相等,则dp[i][j]=dp[i+1][j-1]+2;若不等 一开始想当然认为是dp[i][j]=dp[i+1][j-1],后来发现如果出现abb这种,最长回文长度应该是2而不是1,因为有可能在一侧添加的字母也增加了回文子串的长度,于是又想那就枚举中间所有情况取最大,原创 2021-08-12 10:46:39 · 198 阅读 · 0 评论 -
leetcode_313. 超级丑数
题目链接喜极而泣,刷力扣还是有效果的,今天这个题没有看题解做出来了,再一看和官方题解用最小堆的思路一致,由此联想到做丑数II时确实也是用的这种方法,今天就有种信手拈来的感觉了呜呜(当然值得一提的是看了一眼提示有优先队列才开始联想的qwq)核心思想如下:(摘自官方题解)要得到从小到大的第 n个超级丑数,可以借助最小堆实现。初始时堆为空。首先将最小的超级丑数 1加入堆。每次取出堆顶元素 x,则 x 是堆中最小的超级丑数。对于数组 primes 的任意质数 p,p*x 也是超级丑数,因此将数组pri原创 2021-08-09 09:58:05 · 137 阅读 · 0 评论 -
leetcode_581. Shortest Unsorted Continuous Subarray
题目链接这个题一开始想用双指针,用left和right移动,想的是遇到第一个逆序的位置就是left,其实这只是对题目中的2 6 4 8 10 9成立,假如说是个2 4 8 6 10,按照一开始的算法会把6的位置作为最左端,显然不对。但是一开始雏形的思想中还是有一点正确的部分的,对2 6 4 5 10 12 11,记录left是6的位置后,5不仅要和4比,也要和6比,比4大比6小right就要更新到5,而处理10 12之后时,只要都比left大,就只需要保证之后的是递增的,遇到11时发生逆序right就原创 2021-08-03 10:31:04 · 69 阅读 · 0 评论 -
leetcode1104. Path In Zigzag Labelled Binary Tree
题目链接这个题很容易首先联想到完全二叉树的性质,父结点下标i,如果有左儿子,左儿子下标2i,如果有右儿子,右儿子下标2i+1,相应的一个结点的父结点就是i/2下取整。但是因为这个题在偶数行是从右到左进行计数,因此找一个结点的父结点,就要按照他上一层的排列顺序给他重新找到他的标号。首先知道label,可以知道它所在的深度depth为⌊log2(label)⌋+1⌊log_2(label)⌋+1⌊log2(label)⌋+1,那么这一层最小的编号是m=2(depth−1)m=2^{(depth-1)}原创 2021-07-29 16:47:16 · 131 阅读 · 0 评论 -
leetcode863. 二叉树中所有距离为 K 的结点( 建图+BFS)
题目链接根据题意很容易想到用从target结点开始进行dfs或者bfs但是因为给的是二叉树,父结点信息无法直接得到,所以要想办法把二叉树转化成邻接表来存储,事实上对于树的每一个结点,它的邻接点只是缺少一个父结点信息而已,鉴于树上的每个结点都具有唯一的值,因此可以建立一个map,key就是结点的val,值就是该结点的父结点,这样每个结点的邻接点都可以访问到了,对图进行dfs或者bfs就可以了。这里我采用的是BFS,因为需要比较层次信息,于是设计了一个结构体存储结点和相应的层次,但是比较麻烦,看了大佬的原创 2021-07-28 11:30:11 · 115 阅读 · 0 评论 -
力扣1713. 得到子序列的最少操作次数 (LCS、LIS)
先恶补一下最长公共子序列(LCS):主要参考题目:力扣1143. 最长公共子序列参考题解:题解1题解2假设字符串text1和text2的长度分别是m和n,创建(m+1)*(n+1)的二维数组dp,其中dp[i][j]表示text1[0:i]和text2[0:j]的最长公共子序列的长度。(其中text1[0:i]表示text1中下标0到i-1对应的子序列,即长度为i的前缀)动态规划的边界:当i=0或j=0时,dp[i][j]=0;1.当i=0时,text1[0:i]为空串,空串与任何字符串的最原创 2021-07-26 17:18:16 · 174 阅读 · 0 评论 -
滑动窗口模板 && Leetcode1838. 最高频元素的频数
滑动窗口模板int left,right;//视情况赋0或1int res;//结果,根据实际情况确定初值int total=0;//区间和while(right<nums.size()){ 更新total while 窗口内数据不满足要求 更新total 收缩左边界 更新res}return res;题目链接:https://leetcode-cn.com/problems/frequency-of-the-most-frequ原创 2021-07-19 19:50:53 · 106 阅读 · 0 评论