- 博客(65)
- 收藏
- 关注
原创 Leetcode刷题DAY69
我们可以用一个哈希表统计 sss 所有长度为 101010 的子串的出现次数,返回所有出现次数超过 10的子串。每次搜索到一个方格时,如果其与初始位置的方格颜色相同,就将该方格加入队列,并将该方格的颜色更新,以防止重复入队。第一种方法是使用另一个空白的矩阵来存储旋转之后的结果,但是题目要求不能使用,所以要求我们要原地旋转。使用一个零时变量temp来存储要旋转的位置,保存原来的旋转过去位置的值,然后把那个值放到下一个位置。第一种解法,简单的动态规划dp,是爬楼梯问题的扩展。从代码难度上,更喜欢第三种解法。
2024-04-07 17:24:39
898
原创 leetcode题库练习9\268\771
简单的想法就是将数字转化为字符进行比较,但是这样占空间官方的题解为时间复杂度O(longn)空间复杂度为O(1)
2024-04-04 18:15:22
274
原创 DAY67:数组、链表、字符串、哈希表的刷题小结
找到环的入口位置,也就是在相遇节点处,定义一个指针index1,在头结点处定一个指针index2。原地移除数组上的元素,数组上的元素,不能真正的删除,因此只能覆盖。pre和cur一前一后,先将cur-next保存好,然后将pre连接到cur-next上,将pre箱右移动,cur向右移动。设计快慢指针,low走一步和fast走两步,如果两个指针相遇了,说明链表有环,不然快指针会一直比慢指针快。这题的hash表,是以数组实现的,因为字母只有26个,所以只需要26个数字的数组。设计一个节点来保存当节点的下一个。
2024-03-09 13:11:30
846
原创 DAY66:双指针专题
找到环的入口位置,也就是在相遇节点处,定义一个指针index1,在头结点处定一个指针index2。让index1和index2同时移动,每次移动一个节点, 那么他们相遇的地方就是环形入口的节点。原地移除数组上的元素,数组上的元素,不能真正的删除,因此只能覆盖。pre和cur一前一后,先将cur-next保存好,然后将pre连接到cur-next上,将pre箱右移动,cur向右移动。设计快慢指针,low走一步和fast走两步,如果两个指针相遇了,说明链表有环,不然快指针会一直比慢指针快。
2024-03-04 11:14:40
601
原创 【视频编码\VVC】编码结构基础知识
编码时的分层处理架构和编码后码流的语法架构。为支持视频编码标准的通用性,标准只规定码流的语法语义。片头及其以上的语法架构。VVC编码码流包含一个或多个编码视频序列(CVS),每个CVS以帧内随机接入点(IRAP)图像或逐渐解码刷新(GDR)图像开始。
2024-03-02 01:42:42
1424
原创 DAY65: 图论入门797、200、695
仅仅需要一个容器,能保存我们要遍历过的元素就可以,那么用队列,还是用栈,甚至用数组,都是可以的。但是不同的是这次是计算岛屿的面积,我们遇到岛屿的时候,使用深度优先搜索来计算,搜索的次数就是岛屿的面积。当目前遍历的节点 为 最后一个节点的时候,就找到了一条,从 出发点到终止点的路径。先找到x节点graph[x][i]链接到其他那些节点,将选中的节点加入到路径中去。如果用栈的话,就是第一圈顺时针遍历,第二圈逆时针遍历,第三圈有顺时针遍历。代码如下,具体思路看代码就能懂,特别需要注意复杂代码的写法。
2024-02-29 10:54:05
564
原创 DAY65:第一阶段总结
其中数组、链表、字符串中常使用双指针法解决问题,在后续的学习过程里需要进一步巩固学习。栈和队列作为很基本的数据结构在很多问题中应用,需要掌握。二叉树和回溯算法的学习起来较为困难,因为之前完全没有接触过。贪心和动态规划是非常重要的章节,也是在二刷的时候需要重点掌握的。之前从没有系统的接触过秋招的任何题目,也没有刷leetcode的习惯,所以面对这么多题目的时候,是无从下手的。而作者按照合适的知识点分布,将这些知识由浅入深,循序渐进的带着我们入门。同时65天的学习,让我养成了写博客的习惯。
2024-02-29 08:16:57
160
原创 【视频编码\VVC】帧间预测编码基础知识
利用时间相关性,使用邻近已编码图像像素值预测当前图像的像素值,能够有效去除时域冗余。目前的视频编码标准中,帧间预测都采用了基于块的运动补偿技术。当前图像的每个像素块在之前已编码图像中寻找一个最佳匹配块的过程。用于预测的图像最佳匹配块到当前块的位移当前块与参考块的像素差值根据MV得到的参考块作为当前当前块预测值的过程只能使用帧内预测编码技术可以使用帧间预测编码技术可以选择使用前向预测、后向预测或双向预测。一个宏块拥有2个MV。去除相邻块运动矢量之间的相关性。MV不一定是像素的整数倍MV预测(MVP)
2024-02-28 18:21:03
1960
原创 DAY64:单调栈03、84
这样总体逻辑是一样的,依旧考虑的是要输入元素与栈顶元素比较,大于小于等于的情况,在这里我们要找到左右小于的柱子,因此是在小于的情况下考虑。本题与昨天接雨水的问题正好相反,要寻找的是左右小于它的柱子。栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。也可以使用双指针的方法来保留每个元素左右小于该柱子的坐标。最后的结果就是底乘以柱子的高度。
2024-02-28 10:52:00
265
原创 【视频编码\VVC】量化基础知识
是将信号的连续取值(大量离散取值)映射为有限多个离散赋值的过程。实现信号取值多对一的映射。可以有效减少信号取值的空间,进而获得更好的压缩效果。根据输出和输入数据的类型,可以将量化器分为两种类型。VVC除了使用标量量化,还采纳了低复杂度的矢量量化(依赖量化DQ)
2024-02-27 13:23:52
1693
原创 DAY63: 单调栈02\503\42
按照列来看,每一列雨水的高度,取决于该列左侧最高的柱子和右侧最高的柱子中最矮的那个柱子的高度。第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。如果遇到相同高度的柱子,需要使用最右边的柱子来计算宽度。使用双指针来遍历,把每一个位置的左边最高高度记录在一个数组上(maxLeft),右边最高高度记录在一个数组上(maxRight),避免重复计算。基本思路和每日温度一样,但是这道题引入了循环数组,因此需要考虑对循环数组的处理。一种做法是将两个nums接在一起,处理完最后一个元素之后,取原来的长度。
2024-02-27 08:55:43
312
原创 DAY62:单调栈入门739、496
当前遍历的元素T[i]大于栈顶元素T[st.top()]的时候,需要找到右边第一个比自己大的元素。一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,常使用调栈来记录之前遍历过的元素。时间复杂度为O(n)。本题题意是说nums1 是 nums2的子集,找nums1中的元素在nums2中下一个比当前元素大的元素。单调栈递增(从栈口到栈底顺序),就是求右边第一个比自己大的,单调栈递减的话,就是求右边第一个比自己小的。时间复杂度:O(n)空间复杂度:O(n)
2024-02-26 10:10:17
266
原创 DAY60:动态规划(回文子序列)+总结
代码随想录确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组基础题目背包问题股票问题子序列问题打家劫舍问题。
2024-02-24 13:26:54
411
原创 DAY59:动态规划(编辑距离)583、72
代码随想录主要写了如下题型判断子序列不同的子序列字符串的删除操作编辑距离公式的含义逐渐变的抽象,在编辑距离的时候,并不需要真正的操作,只需要计算步数就可以了。
2024-02-23 12:15:01
843
原创 DAY58:动态规划(子序列3)392、115
(2)当s[i - 1] 与 t[j - 1]不相等时,dp[i][j]只有一部分组成,不用s[i - 1]来匹配(就是模拟在s中删除这个元素),即:dp[i - 1][j]所以当s[i - 1] 与 t[j - 1]相等时,dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。(1)当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两部分组成。
2024-02-22 10:09:26
476
原创 DAY57:动态规划(子序列2)1143、1035、53
如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;很简单的可以想出:dp[i] = max(dp[i - 1] + nums[i], nums[i]);
2024-02-21 11:55:56
446
原创 DAY56:动态规划(子序列系列)300\674\718
如果dp[i][j] :以下标i为结尾的A,和以下标j为结尾的B,最长重复子数组长度为dp[i][j]。因此状态状态公式变成if(nums[i] > nums[i - 1]) dp[i] = dp[i - 1] + 1;dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。因为dp[0][0]没有定义初始化为0,同时dp[i][0]和dp[0][j]也没有含义,所以初始化为0。dp[0][0]没有定义,所以i,j要从1开始。空间复杂度:O(n)
2024-02-20 11:39:49
406
原创 DAY55:动态规划(买卖股票的最佳时机3)
这段时间跟着代码随想录完成了下述的股票问题,受益匪浅。代码随想录做这种类型的题目,一定要注意状态的划分和状态的变化。1、分析状态和状态变化的关系,只有这些清楚了才能正确解题,找到递推公式。需要重点掌握这些状态函数的写法。2、注意初始化,初始化的数值设置很重要,不然容易出错。3、最后输出往往是取最大的。4、递推顺序,一般是从前到后。
2024-02-19 13:41:31
1190
原创 DAY54: 动态规划(买股票的最佳时机2)
这道题最大的难点在于状态更新的分析和初始状态的定义,其他的逻辑和之前的题目一样。如果想要优化,可以使用滚动数组的方式来减少空间的使用。只需要在上题的基础上简单修改代码,变成循环的就可以了。于之前的题目不同,这道题需要先后最多完成2笔交易。这道题在上题的基础上,是实现了k次交易。0、不买卖(起始被下面4个包含了)dp[0][0]=0;空间复杂度:O(n × 5)2、第一次不持有股票。4、第二次不持有股票。时间复杂度:O(n)
2024-02-18 16:55:21
375
原创 DAY53:动态规划(买股票的最佳时机)
同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);那么dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);dp[0][0]表示第0天持有股票,此时的持有股票就一定是买入股票了,所以dp[0][0] -= prices[0];dp[0][1]表示第0天不持有股票,不持有股票那么现金就是0,所以dp[0][1] = 0;空间复杂度:O(n)
2024-02-17 22:32:30
504
原创 DAY52:动态规划(打家劫舍系列)
如果不偷当前节点,那么左右孩子就可以偷,至于到底偷不偷一定是选一个最大的,所以:val2 = max(left[0], left[1]) + max(right[0], right[1]);所以dp[i]取最大值,即dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i]。dp[0]为num[0],dp[1]为max(num[0],num[1])因此只需要这两种情况都考虑,选一个最大的就可以。
2024-02-17 22:02:49
359
原创 DAY50:完全背包、爬楼梯、322、279
凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1,所以dp[j] = min(dp[j - coins[i]] + 1, dp[j]);因为先走5再走1和先走1再走5是不一样的,因此这道题是排列问题,所以背包容量要放在循环外面。考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。
2024-02-14 20:20:17
458
原创 DAY44:完全背包问题介绍、518、377
第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。因为求的是组合数,因此要避免重复的情况,所以对遍历顺序有要求。要外层for循环遍历物品(钱币),内层for遍历背包(金钱总额)。C++测试用例有两个数相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。之前我们写过一道题,求组合数,可以根据 dp[j] += dp[j - coins[i]];
2024-02-08 17:32:19
363
原创 DAY43:背包问题提升1049、494、474
这道题和昨天的最后一道题很像,都是重量和价值一样等于stone[i]。本质思想是尽量将石头分成相似的两堆。如果出现两堆价值一样,那==0,如果不一样,就用大的那堆减去小的那堆就是最后相撞之后的重量。从而把题目化简为01背包问题。时间复杂度:O(m × n)空间复杂度:O(m)public://需要初始化,没有初始化为0会报错i++){//分为两堆石块的目标//确定dp数组的大小i++){j--){//背包问题。
2024-02-07 02:19:17
285
原创 DAY42:01背包问题+应用
放物品i:由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值。不放物品i:由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]。dp[j]容量为j的背包,所背的物品价值最大可以为dp[j]。
2024-02-06 00:18:58
1079
原创 【视频编码\VVC】变换编码基础知识及标准设计相关参数
DCT形式与输入信号无关并且存在快速实现算法,并且性能接近K-L变换。H.264第一次使用了整数DCTH.265沿用了整数DCT,进行了不同尺寸的变换形式,还引入了离散正弦变换H.266同时采用了DCT和DST,并且采用了多种基函数的变换形式,拓展了变换的尺寸(可分为8种类型,但是DCT-2因其较低的计算复杂度和相对高的编码效率,一直是核心变换技术)
2024-02-05 20:26:05
1477
原创 DAY41:动态规划343、96
dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量。元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量。元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量。元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量。dp[i] += dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量]空间复杂度:O(n)
2024-02-05 11:25:39
429
原创 DAY39: 动态规划不同路径问题62
想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。所以dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。因此我们的递推公式还是dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。
2024-02-04 22:02:48
487
原创 DAY38:动态规划理论基础+入门509、70、746
如果第i个台阶,到第i-1的时候只需要上一个,到i-2的时候上2个台阶,那样状态函数还是斐波拉契数列,第i-2状态的时候的走法加上第i-1个状态的时候的走法。一个很好的方法就是往前推导,如果是最后一步了,那往前肯定选的是最小cost的dp。写代码之前一定要把状态转移在dp数组上的具体情况模拟一遍,心中有数才能写出正确的代码。2、递推公式:dp[i] = dp[i -1] + dp{i - 2};1、确顶下标和含义:第i个数的斐波那契数值是dp[i]3、初始化:dp[0] =0,dp[1]=1;
2024-02-02 13:17:35
120
原创 DAY37:贪心算法738
代码随想录贪心题目没有统一的模板和规律,理解题目基本意思之后,题目代码一般都比较简单。但是如果没有先判断出是贪心问题,没有想到精妙的贪心策略就比较困难了。
2024-02-01 16:00:03
1607
原创 DAY36: 贪心算法part5区间问题435、763、56
首先将区间按照左区间从小到大进行排序,判断前面的元素右区间和后面的元素左区间是否重叠,如果重叠了需要统计重叠区间的数量,同时更新区间,选择保留右区间元素较小的那个,防止多次删除的问题。本质上还是和第一题判断区间的思路差不多,只需要判断一下是不是区间重合,如果区间重合就合并,更新结果。当然这道题还有其他的做法,比如使用左区间排序来减去不重叠的区间,和昨天学习的到的打气球的题目属于一样的框架和题型。基本思路是寻找到遍历过的所有字母的最远编解来划分。时间复杂度O(nlogn)
2024-01-31 16:53:45
460
原创 DAY35:贪心算法part4、860\406\452
当出现两个维度的数值进行贪心的时候,我们需要注意两个维度一定要有先后顺序,不然容易顾此失彼。所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。因为美元10只能给账单20找零,而美元5可以给账单10和账单20找零,美元5更万能!如果把气球排序之后,从前到后遍历气球,被射过的气球跳过,记录一下箭的数量就可以了。情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5。账单是20的情况,为什么要优先消耗一个10和一个5呢?情况二:账单是10,消耗一个5,增加一个10。但是比较考验代码功底。
2024-01-30 16:07:32
289
原创 DAY34:贪心算法part、1005\134\135
i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。在确定左边评分比右边评分大的情况下,从后向前的过程中,cand[i] = max(candy[i], cand[i+1] +1);在先确定右边评分比左边评分大的情况下,从前向后遍历的过程中candy[i] = candy[i-1]+1是一种代码的写法。空间复杂度:O(1)
2024-01-29 20:41:23
768
原创 DAY31:贪心算法入门455、53、376
贪心算法的基本思路是通过局部最优从而达到全局最优,但是有时候局部最优并不一定导致全局最优,这样就需要动态规划的方法。在实际的问题中,没有统一的代码套路和模板,具体问题具体分析。贪心的思路是,设计一个count,当连续和为负数的时候,加上后面的数字就会变小,因此只要连续和不为负数就可以继续往下贪心。这道题思路太复杂了,但是代码很简单,这次先学习思路,之后还需要继续刷题。另一种思路是把大饼干先给大胃口的人。时间复杂度:O(nlogn)空间复杂度:O(1)时间复杂度:O(n)空间复杂度:O(1)
2024-01-26 21:13:26
757
原创 DAY30:回溯算法332\51\37基本思路了解+总结
组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集棋盘问题:N皇后,解数独等等。
2024-01-25 16:41:52
930
原创 DAY29:回溯算法491\46\47
这题和组合问题有类似的地方,但是全排列,元素的位置是有顺序的,因此并不需要设计idx,对于每个分支都需要向下递归。所以for循环都是从i=0开始的,但是因为不能重复选取元素,因此需要使用used数组来记录已经使用过的元素。虽然是递增子序列,但是不能对之前的数组进行排序,这样就找不到递增的序列了。在上题的基础上涉及去重的操作,需要去掉数字相同的元素的情况。时间复杂度: O(n!空间复杂度: O(n)
2024-01-24 19:33:29
589
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人