算法
文章平均质量分 59
Shallow_Carl
Never Give Up!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
实现前缀树
前言这道题做完,成就感还是满满当当的,嘿嘿!(虽然时间复杂度不是很好,但是空间复杂度很好看)题目描述Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类: Trie() 初始化前缀树对象。 void insert(String word) 向前缀树中插入字符串 word 。 boolean search(String word) 如果...原创 2022-03-31 18:42:12 · 882 阅读 · 0 评论 -
课程表--力扣Hot100
题目描述你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。示例原创 2022-03-31 17:02:52 · 2224 阅读 · 0 评论 -
LRU缓存
题目描述请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。 void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 ke...原创 2022-03-19 13:35:01 · 1291 阅读 · 0 评论 -
翻转字符串里的单词
题目描述给你一个字符串 s ,逐个翻转字符串中的所有 单词 。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。说明: 输入字符串 s 可以在前面、后面或者单词间包含多余的空格。 翻转后单词间应当仅用一个空格分隔。 翻转后的字符串中不应包含额外的空格。示例 1:输入:s = "the sky is blue"输出:"blue is sky the"示例 2:...原创 2022-03-07 11:38:43 · 260 阅读 · 0 评论 -
四数之和一二
双指针+哈希map-----YYDS!!!原创 2022-02-22 14:28:59 · 282 阅读 · 0 评论 -
丑数--动态规划
题目描述我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。说明:1是丑数。n不超过1690。思路根据动态规划五部曲:1)dp[i]表示第 i 大的丑数2)递推公式:我们有dp[i],那么dp[i+1]可以由dp[p1]*2,dp[p2]*3,dp[p3]*5,p1,...原创 2022-02-20 21:32:13 · 776 阅读 · 0 评论 -
动态规划--不同的子序列
前言这道题绝对是我目前做过的题中数一数二难的,思路太过于清奇,让我一时难以接受,所以还需要多多回味,加以消化.题目描述思路动态规划五部曲1) 规定dp[i][j]的含义:表示s[0,i-1]中出现t[0,j-1]的次数2)递推方程:if(s[i-1]==t[j-1]) dp[i][j]=dp[i-1][j-1]+dp[i-1][j]可以这样理解:s="rara" ,t="ra" i-1==3,j-1==1,此时我们可以选择两种匹配方式,一种是拿后面的r和a,和t中的"ra".原创 2022-02-05 20:20:32 · 756 阅读 · 0 评论 -
动态规划--编辑距离(上)
题目描述:2.判断子序列3.两个字符串的删除操作思路这三道题其实都是一类题:操作字符串 使得两个字符串相等或者使得一个为另一个的子字符串,判断子序列可以通过判断两个字符串的最长子序列长度是否和短的那个相等.下面我们着重讲解一下编辑距离这道题目:1)规定dp[i][j]表示使得t[0,i-1]到t[0,j-1]相等的最少操作次数2)递推公式:如果s[i]==t[j],说明不需要操作,dp[i][j]==dp[i-1][j-1],如果不相等的话,我们有三种选择:删..原创 2022-02-05 20:03:06 · 925 阅读 · 0 评论 -
动态规划--回文串系列
1.最长回文子串2.前言动态规划回文串系列一直是我的一个痛点,今天上午看了书,本以为已经完全看懂了,结果下午闭书敲代码,敲了一下午还没有搞定,哎,果然代码不是靠看懂的,中间思考过程的艰深,只有敲过了代码才能感受到.思路dp五部曲:1)确定dp[i][j]含义,这一步最重要,也是最难抉择的,为什么说最难抉择呢?到底dp[i][j]表示以下标[i,j]的字符串还是下标[i+1][j-1]的字符串呢?还是下标[i-1][j-1]的字符串呢?我们选择下标[i][j]的字...原创 2022-02-05 17:39:31 · 1589 阅读 · 0 评论 -
剪绳子二力扣
题目描述给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m - 1] 。请问 k[0]*k[1]*...*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入: 2输出: 1解释:原创 2022-01-22 17:58:14 · 405 阅读 · 0 评论 -
和为S的序列
题目描述输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]示例 2:输入:target = 15输出:[[1,2,3,4,5],[4,5,6],[7,8]]限制:1 <= target <= 10^5思路利用题目中给定的序列连续的特点,我们想到等差数列求和公式.我.原创 2022-01-22 17:27:49 · 490 阅读 · 0 评论 -
螺旋矩阵+栈的压入弹出顺序
题目描述给你一个 m 行 n 列的矩阵matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]提示:m == matrix.lengthn == matrix[i]...原创 2022-01-22 17:21:34 · 185 阅读 · 0 评论 -
数值的整数次方
前言第一次接触快速幂运算还是大二上学期,当时就惊叹于它的高效率和适用性,尤其是它是出自一个拿过ACM的银牌大牛给我讲述,这个题在我当时幼小的心灵中留下了难以磨灭的印象.题目描述实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。示例 1:输入:x = 2.00000, n = 10输出:1024.00000示例 2:输入:x = 2.10000, n = 3输出:9.26100示例 3:输入:x = 2.000原创 2022-01-16 11:17:54 · 322 阅读 · 0 评论 -
二叉树的后序遍历序列
题目描述思路说实话,我第一眼看到这个题目,一点思路都没有,除了知道二叉树后序遍历遵循"左右根"的遍历方式以外其他的什么都不知道,两眼一抹黑....后来看了题解又摸索着自己写,写来写去,都有问题,emmm,看别人写的十分简洁,自己写的一堆废话.实在是让我汗颜........后来不得已去看了K神的题解.K神,YYDS正文思想就是分治递归,我们寻找第一个大于最后一个元素的节点,保存这个位置的index,然后移动当前下标直到到达right,凭借postorder[right]将数..原创 2022-01-15 19:42:39 · 756 阅读 · 0 评论 -
二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。为了让您更好地理解问题,以下面的二叉搜索树为例:我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。特别地,我们希望可以就地完成转换操作.原创 2022-01-09 15:29:24 · 485 阅读 · 0 评论 -
矩阵中的路径
前言这道题我折腾了一个半~两个小时,终于AC了,特此纪念.题目描述给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。示例 1:输入:board = .原创 2022-01-08 17:32:19 · 144 阅读 · 0 评论 -
机器人的运动范围
思路按照DFS模板来套,递归三部曲:返回值:NULL中间逻辑:访问位置为true,数量统计count++返回逻辑:如果当前的和val>k或者当前位已经访问过了,直接返回.代码class Solution {public: int a[4] = { -1,1,0,0 }; //行,上下左右 int b[4] = { 0,0,-1,1 }; //列,上下左右 int count=0; int sum(int i, int j) {..原创 2022-01-08 17:18:15 · 464 阅读 · 0 评论 -
最长不含重复字符的子字符串
题目描述思路状态方程:dp[i]表示以str[i]结尾的最长无重复字符的数量,对于当前的字符s[i],如果之前相同的字符出现在dp[i-1]之外的范围内,则dp[i]=dp[i-1]+1,如果出现在dp[i-1]之内的范围,那么dp[i]=i-temp.(temp表示上一次相同字符出现的位置,可以使用hash表的KEY-VAL来映射)初始化:dp[0]=1;递推顺序:从前到后代码class Solution {public: int lengthOf..原创 2022-01-07 20:13:53 · 370 阅读 · 0 评论 -
把数字翻译成字符串
题目描述思路这道题和上台阶非常相似,要么一次是上一级,还是一次上两级.dp[i]表示以nums[i]为结尾的翻译的方法种类数.如果dp[i-1]与dp[i]组合而成的字符串在10~25之间,说明可以进行组合,如果不在这个区间之内,那么等于旁边的dp[i-1]的种类.我们在初始化时,dp[0]=1,表示第一位只有一种翻译方法,但是dp[1]要判断是1,还是2.我们当前dp[i]取决于dp[i-1]和dp[i-2],因为只有两种方法能够到达现在.#include<i.原创 2022-01-07 19:51:16 · 442 阅读 · 0 评论 -
连续子数组的最大和
思路一--暴力破解思路二--动态规划动态规划五部曲:第一步:确定dp函数,dp[i]表示以nums[i]结尾的数组最大连续和第二步:确定递推公式:dp[i]=max(dp[i-1],nums[i]) ,直接判断之前的dp[i-1]是不是大于0也可以.第三步:确定递推顺序,从前到后 ,dp[i]由dp[i-1]推出,所以是从前到后第四步:初始化,dp[0]=nums[0], 因为dp数组表示以nums[i]结尾的最大连续和第五步:手动计算,同时输出日志来记录对照.#in...原创 2022-01-07 14:47:54 · 663 阅读 · 0 评论 -
股票的最大利润
前言:今天和女朋友分手了,十分emmmm怎么说呢,百感交集,剩下的还是些许的祝福,祝前途似海,再见时,依旧少年!目录思路一思路二----动态规划题目描述注意本题的只可以交易一次的这个条件思路一贪心算法:每一次记录到当前[0,i]之间的最小值,然后用当前prices[i]-min_price,迭代记录即可.class Solution {public: int maxProfit(vector<int>& prices)..原创 2022-01-06 16:00:40 · 302 阅读 · 0 评论 -
LeetCode160相交链表
题目描述给你两个单链表的头节点headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。自定义评测:评测系统 的输入如下(你设计的程序 不适用 此输入):intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0listA - 第一个链表listB - 第二个链表sk.原创 2021-12-01 10:43:13 · 267 阅读 · 0 评论 -
单词规律LeetCode290
题目描述思路看到这道题目下意识想到了hash_map,因为这种一一对应关系不就是hash_map的特长吗?1)我一开始只想到了从patttern到str的映射,先将str使用模拟进行单词分割存储在vec<string>数组中间.2)但是却忽略了eg:pattern="abba" str="dog dog dog dog dog"这样的情况,这要求我们不仅要建立从pattern到str的映射,还需要建立从str到pattern的映射!也就是说,要建立两次hash_map...原创 2021-11-30 14:38:52 · 940 阅读 · 0 评论 -
LeetCode43字符串相乘
目录题目描述思路:普通竖式优化竖式优化代码题目描述思路:一开始我想要使用atoi()和to_string()两个函数(分别来自cstdlib和sstream库),但是最后的结果超过了long的限制.所以我就没法了,想着,硬着头皮模拟一遍好了.普通竖式思路比较简单,我们写两个函数.一个函数负责返回两个string相加的结果,另一个函数负责模拟每一行相乘的结果.先算出相乘的结果,再拿结果和之前算出的res进行字符串相加函数操作.中间有一些细节问题要注意:...原创 2021-11-30 12:35:18 · 984 阅读 · 0 评论 -
DFS深度优先搜索模板
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言DFS是一种搜索可行解方式的方式,通常用于求"所有,全部..等一类问题",今天在写深度搜索问题时问题屡屡出现,搞得我怀疑自己以前学的到底有菜鸡......特此写下一篇手记,供大家参考,也供自己日后复习.一、DFS的例题形式?这里贴出最经典的一类问题,下面给出两道LeetCode原题:①给你一个由'1'.原创 2021-11-26 16:17:45 · 236 阅读 · 0 评论 -
LeetCode142环形链表二
题目描述:142. 环形链表 II难度中等1266给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从 0 开始)。如果pos是-1,则在该链表中没有环。注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改链表。示例 1:输入:head = [...原创 2021-11-28 10:33:03 · 145 阅读 · 0 评论 -
和为K的子数组LeetCode560
目录题目描述思路思路一--滑动窗口思路二--暴力求解思路三--前缀和+hash优化补充题目描述思路思路一--滑动窗口本来看到题目想着,我的天啊,这不是可以用滑动窗口完美解决吗?直到我看到数据可以为负数,我才开始意识到问题的严重性,最后想着使用动态规划,但是推导了半天硬是推导不出来表达式,无奈选择了暴力求解...思路二--暴力求解思路还是滑动窗口,但是这回遍历时右指针right一直要从左往右遍历到尽头才行,结果也不用说了,超时.........原创 2021-11-23 19:54:30 · 307 阅读 · 0 评论 -
LeetCode334递增的三元子序列,贪心+双指针
目录题目描述:思路代码题目描述:思路很自然能够想到使用两个数值来记录最小值和次小值,并且有一个前提--次小值>最小值,那么我们在后面的遍历过程中只要找到一个值大于次小值,结果返回true,如果遍历整个数组都没有找到,结果返回false.我们假设最小值small,次小值mid但是我们对于最小值和次小值的更新策略是什么呢?比如:small>=nums[i],我们就能够直接更新small呢???关键在这里---因为nums<=small,所以更新后得.原创 2021-11-23 11:39:13 · 484 阅读 · 0 评论 -
搜索二维数组LettCode240
题目地址:https://leetcode-cn.com/problems/search-a-2d-matrix-ii/思路一遍遍历在这里出现了很有趣的现象:我们都知道根据程序局部性原理来讲,按照先行再列的遍历速度肯定是要比先列后行的遍历顺序的速度要快得多的.那么我们如何书写才能在最快时间内遍历二维数组呢?使用下标访问吗?还是使用迭代器来访问?或者应该怎么写?但是标答中给出的遍历方式吸引了我的注意.....操作class Solution {public: ...原创 2021-11-22 17:28:28 · 615 阅读 · 0 评论 -
Line 1034: Char 9: runtime error: reference binding to null pointer of type ‘int‘ (stl_vector.h)
题目链接今天在刷LeetCode时出现了意外.....结果最后出现了意外:开头处.经过一番调试,我发现是在使用函数库提供的sort()函数时,配置cmp函数出现了意外:但是随后我们将等号去掉:其实在代码处理中不用管intervals[i][1],我们只需要对第一个元素值进行排序即可.所以千万要注意:cmp函数里面千万千万不要写等号,不然就是会报错!!!!!!#include<vector>#include<algorithm>...原创 2021-11-20 16:33:36 · 4757 阅读 · 2 评论 -
三数之和LeetCode15
题目描述思路我们如果是乱序的数组,如何集合去重?很困难!所以我们先想排序,再进行接下来的操作.如果使用for三重循环,肯定是会超时的.考虑固定第一个指针,第二个指针在第一个指针右边,不断变大,为了最后的a+b+c=0(此时的a是固定的数值),随着b的变大,c一定是会变小的,也就是说,b和c的选择就不是先选择b,再选择c的,我们可以同时选择!令b=a+1(指针意义上的加一!),c=nums[size-1],那么大体思路上就已经解决了.细节问题对于-1,-1,-1,0,1,2,4..原创 2021-11-19 19:44:26 · 927 阅读 · 0 评论 -
前序递归建立二叉树
目录前言思路代码前言上午在写二叉搜索树的最近公共祖先时,很尴尬,发现手写不出来递归建立二叉树的版本,不禁开始怀疑自己到底会不会二叉树,连最基本的建立都不会.....(趁着没人发现赶紧补习一波!!!冲冲冲!)思路其实递归建立二叉树和递归遍历二叉树思路基本是一样的,无非是将原来的"读出数据" 改成"创建节点并为节点赋值",后面都是一样的递归.我们可以使用一个标志位'@'来表示nullptr.代码TreeNode* CreateBiTree(){ ch...原创 2021-11-15 14:29:28 · 5289 阅读 · 0 评论 -
二叉搜索树最近的公共祖先
题目描述之前做过一道类似的题目(简单来说就是原题.)题目说就是给定一个二叉树,搜索公共祖先,思路也是一次遍历,使用数组存储从根节点到目标节点的路径,再根据两条路径来确定最近公共祖先.坎坷本来使用两个指针依次遍历两个vector<TreeNode*>数组,自己在VS上运行时一点问题都没有,等到在LeetCode上跑起来的时候,只想骂人.缝缝补补了半天,终于还是决定看题解.题解优化:使用一个TreeNode*节点,当两个vector<TreeNode*&...原创 2021-11-15 14:08:38 · 1308 阅读 · 0 评论 -
任意长度二维vector数组的输入输出
我们可以参考之前写的一篇文章:任意一维数组的输入输出那么,我们可以借鉴之前的思路,使用两个scanf("%d",&temp)来嵌套输入,这样一来思路就很明确了.#include<iostream>#include<vector>#include<cstdio>using namespace std;//vector<vector<int>> matrixReshape(vector<vector<int&原创 2021-11-08 08:29:07 · 1427 阅读 · 0 评论 -
栈与队列练习题
栈:先进后出,STL标准栈的使用:#include<stack>队列:后进后出---#include<queue>栈基本函数:push(x);压栈pop();弹栈,不返回任何值top();返回栈顶的元素empty();返回true/false,判断栈是否为空使用队列来实现栈的基本操作:思路:我们如果输入的push的元素逆序,最终的pop操作只需要执行队列的front操作即可步骤一:创建暂存队列,每一个元素push先进入暂存队列中.步骤二:原创 2021-10-13 20:49:21 · 462 阅读 · 0 评论 -
链表例题回顾
例一-a(逆置链表)思路:依次遍历链表,将链表每一个节点从前往后依次加入到新的链表中.主要操作: 1)保存head->next 2)修改head->next指向newhead节点 3)将head移动到head->next,同时将newhead指向新加入的这个节点例一-b逆置链表已知链表头结点head,将链表从m到n的位置节点逆序(不申请额外空间)思路:我们只需要记录逆置头结点的前驱结点,以及逆置尾节点的后继节...原创 2021-10-13 10:56:37 · 210 阅读 · 0 评论 -
KMP算法
这块比较难,这边附上大佬讲解,大家可以主要看大佬讲解,我的代码虽然正确,但是参考一下就好了理论篇:https://www.bilibili.com/video/BV1PD4y1o7nd?from=search&seid=12011960581778516900next数组篇:https://www.bilibili.com/video/BV1M5411j7Xx?from=search&seid=12011960581778516900#include<iostream>原创 2021-03-30 21:18:01 · 129 阅读 · 0 评论 -
关于使用贪心思想求解数组连续最大和以及dp解子矩阵的最大和问题通讲
一_数组最大连续子序列题目描述:给定一个数组,求出它的最大连续子序列和思路:根据贪心策略,我们知道,由局部最优可以推导出全局最优1.那么在本题中什么是局部最优呢?我们可以看出每选取的一个集合(一个元素或多个元素)它的和为正数时,它对我们的最大和的全局最优是有帮助的2.那么什么时候对我们的全局最优是没有帮助的呢?当集合内元素的和为负数时,我们肯定不会选取这个集合内部的这几个相邻的元素.再重新选取紧邻集合右边的下一个正向元素,作为一次新的开始.3.我们在不断选取的过程中,如何记录最大值MAX呢?原创 2021-01-22 18:48:06 · 208 阅读 · 0 评论 -
POJ1579--记忆化递归
#include <stdio.h>#include <string.h>int w[25][25][25];int f(int a,int b,int c){ if(a<=0||b<=0||c<=0) return 1; if(a>20||b>20||c>20) return w[20][20][20]=f(20,20,20); if(w[a][b][c]!=0) return w[a][b][c]; if原创 2021-01-19 12:15:01 · 296 阅读 · 2 评论 -
快速排序精解(图文版包你学会!)
最近一直在看排序,看到网课老师讲快排时,感觉好像很简单的样子,直到自己手动敲起了代码,才发现很多地方都有所欠缺,相信很多博友对于快排都不陌生,但是感觉这玩意离自己还是有那么一层纱,如果屏幕前的你也有这种感觉,那么接下来请随我一起揭开这一层薄纱,来一睹它的芳容. ----作者注进阶排序的一般步骤(快排/归并):1.问题的分解2.子问题的递归3.子问题解的合并这里简单且草率地说一下快排和归并的联系(如果说的有问题,还望大牛批评指正):快排和归并是一对难兄难弟,快排重点是问题的分原创 2020-12-30 18:48:26 · 482 阅读 · 0 评论
分享