自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 收藏
  • 关注

原创 LRU与LFU的c++实现

如果该项不存在于缓存中,则将其加入缓存,并放置在链表的头部。LFU算法基于访问频率原理,认为被访问频率最低的数据很可能是不再使用的数据,因此将访问频率最低的数据淘汰出缓存。原理,认为最近使用的数据很可能在近期内再次被使用,而最久未使用的数据很可能是不再使用的数据,因此将最久未使用的数据淘汰出缓存。LRU(Least Recently Used,最近最少使用)是一种常用的缓存淘汰算法。的最少使用 每一个对应的频率维持一个链表, 淘汰最低频率的最后一个。

2023-09-11 10:37:52 228

原创 day58 单调栈

当前元素小于栈顶元素时, 当前元素就是右边界,栈顶元素的下一个元素就是左边界, w = right - left - 1 h = height[s.top()] sum = max(sum, h*w):通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置。当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况。当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况。当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况。

2023-07-30 11:36:24 275

原创 动态规划 回文子串

4. dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。5. 当s[i]与s[j]不相等,那没啥好说的了,dp[i][j]一定是false。思路2 1.s与s.reverse()的最长公共子序列即为其最长回文子序列。相比于最长回文子串,回文子序列不考虑连续,可以进行删减。当s[i]与s[j]相等时。

2023-07-29 09:15:32 209

原创 day56 编辑距离

t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];(在word1加入一个字符就跟当前word2指向的字符相等了,两个字符消去之后就是看 dp[ i-1 ][ j ], 就是word2删除这个字符 )插入一个字符,相当于word2删除这个字符 dp[ i ][ j ] = dp[ i-1 ][ j ] + 1。

2023-07-24 10:38:58 109

原创 day 52 子序列问题

直线不能相交,这就是说明在字符串A中 找到一个与字符串B相同的子序列,且这个子序列不能改变相对顺序,只要相对顺序不改变,链接相同数字的直线就不会相交。最长公共子序列: 只需要保持顺序就可以---->相等加一,不相等子集找最大的。跟最长公共子序列是一样的。就是找一个固定的顺序,而且是最长的。最长重复子序列:必须是连续的 -----> 相等就加一 不相等就为0。关键点:连续单调---->一旦断开,就是一新的开始。

2023-07-13 10:38:31 196

原创 买卖股票的最佳时机

在第 i 天 卖出股票 dp[ i ][ 1 ] = dp[ i ][ 0 ] + prices[ i ]、在第 i 天 卖出股票 dp[ i ][ 1 ] = dp[ i ][ 0 ] + prices[ i ]在第 i 天 买入股票 dp[ i ][ 0 ] = dp[i-1][1] - price[ i ]如果第 i - 1 天就持有股票 dp[ i ][ 0 ] = dp[ i - 1 ][ 0 ]如果第 i - 1 天就持有股票 dp[ i ][ 0 ] = dp[ i - 1 ][ 0 ]

2023-07-12 10:30:09 140

原创 day 48 打家劫舍

情况1 :偷该结点,不偷他的子节点。将map 优化成每一步的二维数组。情况2:不偷该结点,偷子节点。

2023-07-08 18:41:19 297

原创 day 46 单词拆分

如果 有一个单词能够以第i个字符结尾拼接上,能否完全拼接就要看之前的能够成功。如果一个位置已经证明为true 不必再进行更新,下一个单词不合适 这个地方会变成false。(4)注意事项 字符串截取 s.substr(pos, len)(1)dp[i] 第i个 字符结尾的字符串是否能够被拼接。(3)初始化 dp[0] = true。

2023-07-08 18:37:12 363

原创 day 45 完全背包

初始化 求min 则 赋值为 int的最大值 vectordp(amount+1, INT_MAX);递推公式 dp[ j ] = min(dp[ j ], dp[ j-coins[i] ] + 1);内部有无顺序皆可 因为只看min—>先物品后背包 因为只看min 所以先背包后物品可以可以的。看最少数目–>考不考虑顺序皆可—>先背包后物品 或 先物品后背包。背包容量为n 物品为 1~ sqrt(n)硬币数量无限---->完全背包—>正序。dp[i] 登上i阶台阶有多少种方法。

2023-07-07 11:27:39 243

原创 day 44 完全背包

第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。01背包,不可以重复放入物品,所以在决定放入新物品时,需要用到 前 i-1种物品的数值,放到一维数组中,就是当前位置前面那个数字,也就是旧数据。完全背包可以重复放,决定放入第 i 种物品时,这个物品在之前可能已经放进去了,需要用到的是 前 i 种物品的数值。同一个物品,先被反复的放, 再进行下一个物品,所以是没有顺序的组合数。

2023-07-06 11:29:24 156

原创 day 43 01背包

(2) 递推公式,dp[ x ][ y ] = max(dp[ x ][ y ], dp[ x - nums[ i ][ 0 ]][ y - nums[ i ][ 1 ]] + 1);(2) 递推公式,dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);输入:strs = [“10”, “0001”, “111001”, “1”, “0”], m = 5, n = 3。(1)dp[j]的含义,容量为j的背包,最多可以装的价值为 dp[j]

2023-07-05 10:50:28 238

原创 day 42 01背包

则 dp[ i ][ j ] = max (dp[ i - 1 ][ j - w[ i ] ] + v[ i ], dp[ i - 1 ][ j ]则 dp[ i ][ j ] = max (dp[ i - 1 ][ j - w[ i ] ] + v[ i ], dp[ i - 1 ][ j ](3)放进去 dp[ i ][ j ] = dp[ i - 1 ][ j - w[ i ] ] + v[ i ](2)不放 dp[ i ][ j ] = dp[ i - 1 ][ j ]

2023-07-04 11:59:58 284

原创 day 41整数拆分 不同的二叉搜索树

【代码】day 41整数拆分 不同的二叉搜索树。

2023-07-03 15:51:14 303

原创 day39 二维动态规划

dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。:dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。: dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。:当前结点不是石头时dp[i][j] = dp[i - 1][j] + dp[i][j - 1],

2023-07-02 17:46:50 173

原创 day 38 一维动态规划

所有当前的方法种类F(n)取决于 F(n - 1) + F(n - 2)F(n) = F(n - 1) + F(n - 2),其中 n > 1。F(n) = F(n - 1) + F(n - 2),其中 n > 1。注意:爬到楼梯顶部是指爬到 下标cost.size()位置, 飞出数组。当前台阶可以爬一个台阶 也可以是怕两个台阶上来的。dp[i] 爬到第i台阶 需要的花费。

2023-07-02 17:08:31 105

原创 day 37 单调递增的数字/监控二叉树

(3) 左右子节点都为1 该父节点值不变。交给父节点的父节点处理。(1) 子节点有一个为0也就是没有覆盖掉 那么该结点放监控 2。(4) 遍历结束后根节点为 0 则需要在根节点放监控。(2)子节点有一个为2, 该父节点变为 1。思路:将监控放到父节点的位置—>后序遍历。有返回值版本 比树上直接判断更方便。

2023-07-02 16:34:54 91

原创 day36 重叠区间

遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。结束越早越不容易跟别人重叠,结束越早,能够塞下的区间越多,同理去除的区间就越少。思路一:遍历字符串 划分区间。

2023-07-02 10:44:44 427

原创 day 35 根据身高重建队列

情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5。情况二:账单是10,消耗一个5,增加一个10。情况一:账单是5,直接收下。

2023-07-01 16:37:07 48

原创 day 34 贪心算法

i 指向起始位置, j指向站点 如果当前sum<0 i = j+1;直到 绕弯完整的一圈或者是 i 指向的位置超过了 n。前者是找到start 后者是-1。且curSum[0 , j] + curSum[j+1, size()-1] >= 0。前半部分最后一个到不了的站点缺少的油就是后半部分剩下的油来补充的,也就是说可以走通。第一步:将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小。第三步:如果K还大于0,那么反复转变数值最小的元素,将K用完。5. 确保左边比右边大时 糖果比右边大。

2023-06-30 23:28:26 994

原创 day 31

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。思路:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。max 初始化 INT32_MIN 也可以为第一个元素值。思路:最优:收集每天的正利润,全局最优:求得最大利润。思路:用尽可能小的饼干满足小胃口的小孩。

2023-06-23 11:41:51 67

原创 day 搜索 332没做出

【代码】day 搜索 332没做出。

2023-06-22 22:45:46 85

原创 day 29 回溯 全排列问题

组合子集全排列无序无序有序for(i = 0)在叶子处 push_back入口即push_back在叶子处 push_backvisited数组46. 全排列要求顺序 for 循环从0开始可以使用map来记录已经visited的节点或者是从path数组进行判断public :dfs(nums);return;} } } };47. 全排列 II有序包含重复数字---->同一树层进行去重。

2023-06-22 16:12:16 39

原创 day28 回溯 子集问题

【代码】day26 回溯子集问题。

2023-06-20 16:11:04 42

原创 day 27回溯 分割问题

【代码】day 27回溯 分割问题。

2023-06-19 10:28:44 52

原创 day 24 回溯 组合问题

定义一个used数组来记录元素使用情况, 如果当前元素跟跟前一个元素相同 前一个元素没有用,这个肯定是重复的。7. 无限制重复选取 start为 i 也就是从当前元素开始取。for循环就是同一个树层的动作选择 ,跳过同一树层使用过的元素,2. 集合中每个元素只用选用一次 start = i+1;这样会导致树枝层面的去重 (1,1,2)这样的结果丢失。组合问题:不讲究顺序,按照一定规则从N个中找出k个数。2. 组合问题不重复 i = start +1。3. 集合中有重复元素, 去重。

2023-06-16 11:50:28 43

原创 day22 公共祖先

235. 二叉搜索树的最近公共祖先](搜索一条边)(https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/)4. cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是q 和 p的公共祖先。6. 当遇到p q 在同一边的时候 递归的去root->left 或者root->right。5. root就是p 或者root就是q 此时root就是公共祖先。5. cur 大于 q 一定在左子树中。

2023-06-14 10:07:33 95

原创 day 21 二叉搜索树

频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集。如果 频率count 等于 maxCount(最大频率),当然要把这个元素加入到结果集中。2. 利用二叉树性质找差值。首先是必须是中序遍历。

2023-06-13 08:50:42 72

原创 day 17 18 20二叉树

第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。(如果是前序数组那就是第一个元素作为节点元素,在中序数组中找位置)整体遍历(前中后序都可以,因为不涉及出栈节点的特殊操作)从爷爷的视角来找这个左叶子。第二步:如果不为空,最大元素作为节点元素,并且作为切割点,切割左右子树。第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点。第四步:切割中序数组,切成中序左数组和中序右数组。第五步:切割后序数组,切成后序左数组和后序右数组。第一步:如果数组大小为零的话,说明是空节点了。

2023-06-12 19:40:00 41

原创 day 16

从根节点出发,一路向左遍历的的深度等于一路向右的深度,那么左右子树一定是满二叉树直接通过公式进行计算,否则还是按照正常的递归进行。== 2 << hleft - 1 前者需要调用函数,后者位运算稍微快一点。

2023-06-08 10:32:30 80

原创 day 15层序遍历

我的新左节点应该是把右子节点翻转后的返回节点。我的新右节点应该是把左子节点翻转后的返回节点。本题比较的是左右子树,要另开一个函数。二叉树的宽度深度都可以用层序遍历。直接使用swap进行值的更改。从当前root节点看问题。

2023-06-07 10:22:04 35

原创 day14二叉树的遍历

后序遍历的访问要求在右子节点访问之后,那么要不要进行出栈就要看以下两个条件。前序和中序遍历都是一次入栈,区别就是访问的时刻,前序在入栈访问,中序在出栈时访问。

2023-06-06 09:13:12 38

原创 day 13 队列

5. 具体操作: 维持一个单调递减的队列,如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止,移除元素时,如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作。题目:给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。4. 那么新进队的元素应该与队尾元素进行比较,队尾元素小就要一直出队,从队尾出队,使用到双头队列 deque。返回 滑动窗口中的最大值。

2023-06-05 11:20:30 47

原创 day 11栈与队

适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。stoull()//字符串转unsinged long long。这里的map可以在 遍历的时候,遇到左括号压入对应的右括号。stoul()//字符串转unsigned long。stoll()//字符串转long long。stold()//字符串转double。stod()//字符串转double。stof()//字符串转float。stol()//字符串转long。stoi()//字符串转int。

2023-06-03 10:15:02 36

原创 KMP算法

当前 a 与 c 不相同,我们希望从文本串的 a 向前 () 的一个字串相同,这个字符串的长度为 n,那么模式串的j就回退到 n。= p[ j ] 那么 j = k k = next[ j ] 一直回退 直到 p[ j ] == p[ k ]next[1] = 0;重点是首尾两块是相等的 此时p[15] ==p[3] 那么next[16] = 3 + 1 = 4。next[3] = 1 比较p[15] 与p[1]

2023-06-02 18:27:42 38

原创 day 10 栈与队列

pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。将push的元素先放到一个空队列里,然后将另一个非空的队列pop()到这个队列 那么顺序就是对的,一个非空队列和一个空队列轮流倒腾。一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。在push数据的时候,只要数据放进输入栈就好,

2023-06-02 10:46:31 131

原创 day8 字符串

删除p0开始的n0个字符,然后在p0处插入字符串str中从pos开始的n个字符。删除p0开始的n0个字符,然后在p0处插入字符数组cstr的前n个字符。//如果不指明 len 的话,那么直接删除从 pos 到字符串结束处的所有字符。//pos 为要提取的子字符串的起始下标,len 为要提取的子字符串的长度。//在字符串s的pos位置插入字符串str中位置a到后面的n个字符。在字符串s的pos位置插入字符数组cstr从开始到后面的n个字符。// 在字符串s的pos位置插入字符串str。

2023-05-31 14:09:06 38

原创 day 7 三数 四数之和

可以写但是没有用,left的去重是寻找下一个不一样的元素,找到之后,right一定会左移,自动去重。因为和为0 不是某个target 所以可以在 第一个数大于0 时提前结束。将前两个数组的之和 放进map, 遍历后两个数组之和找符合要求的值。查询 target-num[i];疑问:为什么 left参与去重,right不需要。无重,只有一个结果,而不需要顺序执行。如果没有,使用一个map承接当前值,排序 , 然后双指针遍历。2.中间一层循环的去重。1.最外层循环的去重。

2023-05-30 09:46:45 32

原创 day 6哈希表

我只想大呼救命,啊,我用哈希表的时候一直用map,那个时候我看解析很多人用unordered_map,我还想多打这几个字母干啥,我错了。unordered_map 底层才是哈希表,键值是无序的,但是存取都是O(1),这个快!字母就26个 用 ch - ‘a’ 就能转换为下标,所以用数组进行表示也是可以的。map 底层是红黑树,也就是二叉搜索树,键值是有序的 存取都是O(logn)如果出现了之前出现的数字那么就不是快乐数。2.中间一层循环的去重。1.最外层循环的去重。如果用map 不好用。

2023-05-29 15:57:04 42

原创 day4 还是链表

遇到增加节点或者删除节点为了避免各种头尾判断,最好加一个next判断。追上时 2*(A+B) = A + (B+C)*k + C;意思就是A这段路 等于k-1个整环 加上C这段。主要问题,以哪个时间段分手,不会导致节点丢了。NULL 这个时结束,就代表不相交嘛。

2023-05-27 15:36:51 30

原创 day3 链表

【代码】day3 链表。

2023-05-26 20:45:56 92

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除