- 博客(98)
- 收藏
- 关注
原创 【刷题基础知识】-排序专题
排序排序算法时间复杂度总览冒泡排序基本思想代码选择排序基本思想代码 参考自十大经典排序算法(动图演示)和www.acwing.com,花花酱,再加上自己的一些理解 排序算法时间复杂度总览 冒泡排序 基本思想 从前到后,两两元素进行比较,前一个比后一个大则进行交换 第一轮遍历后最后一个元素是最大的元素,第二轮遍历后会将倒数第二大的元素移动到倒数第二个位置上,不断重复遍历该组元素就会将元素按照升序进行排列 代码 基础代码: /* 这种写法的冒泡排序的时间复杂度一定是O(n^2)了 */ #include &
2021-06-29 20:59:49
1025
1
原创 【LeetCode120】-三角形最小路径和
实现思路 动态规划中数据的表示含义: 第i行第j个元素到底层的最短路径 求解: 是该元素相邻两个节点到底层距离+自己本身数值 取最小值 如果从上到下计算,并不合理这样无法求解,且按照定义明显,最上层的元素应该是由下至上依次求解得到的 实现代码 class Solution { public: int minimumTotal(vector<vector<int>>& triangle) { int dp[205][205]; for(
2021-05-21 13:08:41
130
原创 【算法笔记】-算法初步-递归
分治 分治将原问题划分为若干规模较小而结构与原问题相同或相似的子问题,然后分别解决这些子问题,最后合并问题的解,即可得到原问题的解 分为三个步骤 分解、解决、合并 注意: 分治法要保证子问题之间是相互独立的 递归 递归中两个重要的概念: 递归边界 递归式 经典题目 n! 斐波那契序列 全排列 #include <iostream> #includee <cstdio> using namespace std; const int maxn=500+5; int
2021-05-21 12:26:55
159
原创 【算法笔记】-算法初步-排序
sort的使用 sort在进行自定义结构的排序的时候,需要自定义函数cmp 这里面要注意的是strcmp的使用 strcmp头文件:#include <string.h> strcmp的返回值有0,<0,>0
2021-05-19 14:33:54
161
原创 【算法笔记】-入门模拟(留有问题)
PAT1001 害死人不偿命的(3n+1)猜想 #include <iostream> #include <cstdio> using namespace std; int main(){ int n; scanf("%d",&n); int cnt=0; while(n!=1){ if(n%2==0){ n/=2; }else{ n=(3*n+1)/2;
2021-05-13 20:44:58
1091
1
原创 【LeetCode416】-分割等和子集
方法一(位运算) 实现思路 其实是一种几乎使用暴力求解的方法,但利用位运算进行了优化,用位运算中的0或1来代表集合中是否出现该元素,计算下集合中所有元素的和,如果和为总数量的一半,说明满足条件;之后再将满足条件的集合对应的值(并非相加计算的值),也就是代表集合中都有哪儿些元素的那个值,两两相或,如果两个相或的元素之间没有交集也就是相或结果为0的情况下满足条件。 实现代码 class Solution { public: int get_num(vector<int> &nums)
2021-04-10 16:36:49
164
原创 【LeetCode322】-零钱兑换
方法(动态规划) 1.1实现思路 利用之前的思路进行分析,首先分析DP数据代表的集合的含义,设置动态规划 的数组为DP,那么DP[i]代表的就是金额为i时使用的最少的钞票的数量 ,枚举所有和金额i有关系的钞票的金额,从中选择最小的那一个 1.2实现代码 class Solution { public: int coinChange(vector<int>& coins, int amount) { if(!amount) return 0; vec
2021-04-10 09:50:51
120
原创 【Markdown快速上手】
1.标题 标题: # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 #### 五级标题 ##### 六级标题 2.字体 **加粗** *斜体* --删除-- 3.排版 (1)分割: --- *** (2)空格:     (3)居中: <div align=center></div> (4)列表 +无序列表 +//改动无序列表的层级 4.引用相关 (1)>引用 (2)代码块 //```
2021-04-07 19:27:19
153
原创 【LeetCode198】-打家劫舍
方法一(DP) 实现思路 实现代码 class Solution { public: int rob(vector<int>& nums) { if(!nums.size()) return 0; if(nums.size()==1) return nums[0]; vector<int> dp(nums.size()+1,0); dp[1]=nums[0]; dp[2]=max(nu
2021-04-07 16:02:31
124
原创 【LeetCode407】-接雨水 II
方法一 实现思路 实现思路,是基于【LeetCode42】-接雨水的思路,不同点在于不仅要考虑上下左右的最大值,同时也要考虑斜着的最大值最小值,针对每一个点,取这些最大值的最小值减去该点的高度值,就可以得到最终的结果 实现代码(待补充) 这个代码是有些不完善的,现在是只考虑上下左右的最大值,而没有考虑斜着的最大值,这种作法有待补充和优化 class Solution { public: bool inner(int row,int column,int x,int y){ retur
2021-04-07 14:03:04
296
原创 【LeetCode473】-火柴拼正方形
实现思路 实现代码 提交结果及分析 待改进代码: bool cmp(const int a,const int b){ return a>b; } class Solution { public: int sum_nums(vector<int> &nums){ int sum=0; for(int i:nums){ sum+=i; } return sum; }
2021-04-05 20:06:27
222
1
原创 【LeetCode126】-单词接龙 II
方法一 实现思路 实现代码 const int maxn=5000+5; int path[maxn]; void init(){ for(int i=0;i<maxn;i++){ path[i]=-1; } } class Solution { public: vector<string> getpath(bool flag,string beginWord,string endWord,vector<string>& word
2021-03-31 20:39:57
952
原创 【LeetCode127】-单词接龙
方法一 实现思路 主要思路是将字符串映射到来数字 将问题抽象为求解最短路 当两个单词之间只有一个字符不相同时就会有一条无向边 求最短路的方法使用的dfs 实现代码(超时) class Solution { public: int re; void dfs(vector<int> &book,vector<set<int>> &path,int start,int end,int step,int &re){ boo
2021-03-28 13:38:21
186
原创 【LeetCode200】-岛屿数量
方法一(DFS) 实现思路 思路是深度优先搜索+标记法 需要额外开辟一个二维数组book来表明当前元素是否被遍历过,对每一可以构成岛屿遍历的结果使用flag来标记,不同的岛屿使用不同得到flag来标记,由于我设置flag是从-1然后依次递减的,所以最后的结果实际上就是flag数值的绝对值 遍历整个原始的二维数组,每到一个点判断是否为土地且没有被划分到一个岛屿中,如果该土地没有被划分到一个土地中,就以该土地为起点作为一个新的岛屿来找其相邻的岛屿土地 实现代码 class Solution { private:
2021-03-27 11:01:11
99
原创 【LeetCode76】-最小覆盖子串
方法一 实现思路 实现思路是参照了【LeetCode3】-无重复字符的最长子串 双指针+字符哈希 1.首先统计所有匹配的子串出现的字符的种类及has_cnt数量,然后遍历许匹配的字符串 2.同时在这个过程中记录当前的子串word,以及维护字符串s在这个过程中每个字符动态变化的数量cnt 当cnt的数量大于has_cnt的时候,尝试移动begin ————begin能移动的条件为cnt[begin]>has_cnt 3.每次新产生的word子串都要判断一下是否满足条件且小于当前最短的子串结果 判断子串满
2021-03-27 09:23:48
158
原创 【LeetCode187】-重复的DNA序列
方法一 实现思路 这种实际上是一种暴力求解的思想,从头到尾开始遍历所有长度为10的子串,在这个过程中利用map不断记录出现的子串的次数,最后遍历map中的结果,将统计的数目超过1的压入最终的字符数组中 实现代码 class Solution { public: vector<string> findRepeatedDnaSequences(string s) { map<string,int> cnt; vector<string>
2021-03-24 21:21:53
117
原创 【LeetCode3】-无重复字符的最长子串
实现思路 优化至O(nlog(n))的算法,大部分是分治思想后者是二叉树的思想 扫描整个字符串的一般还是考虑O(n)的时间复杂度 实际上是要优化枚举 在枚举的过程中存在很多不必要的枚举,当已经出现重复字符时就应该停止枚举 双指针解决的思想 只要满足begin是永远小于i,这个算法的时间复杂度一定是O(n) 实现代码 提交结果及分析 ...
2021-03-24 20:06:03
128
原创 【LeetCode49】-字母异位词分组
方法一 实现思想 由于每一个字符在字符串的排列组合是很多的,为了便于比较直接将每一个字符串内部进行排序,排完序之后再将整个字符串数组进行排序,在排序的时候需要记录自己原本的数组下标,然后依次遍历字符串数组,当排序后的字符串相同,就将原本字符串的形式压入相同的字符串数组中即可。 实现代码 bool cmp(const pair<string,int> &a,const pair<string,int> &b){ return a.first<b.first
2021-03-24 15:41:46
105
原创 【LeetCode290】-单词规律
实现思路 利用map映射,将pattern中的字符映射到单词中,但实际上不仅要考虑这个映射,也要考虑单词映射到字符的情况,否则将无法识别: “abba” “dog dog dog dog” 这种情况; 除此之外,也要考虑,可能pattern中的字符个数和单词个数不匹配的问题 我的思路是单词映射到字符,字符映射到单词保证两者是一一对应的关系,而另一种思路是使用unsed标志数组来看字符是否在之前已经别的单词映射了来判断。 实现代码 class Solution { public: bool word
2021-03-20 11:01:11
112
原创 【LeetCode409】-最长回文串
方法一 实现思路 主要利用了字符串哈希,将字符串对应的ASCII码作为下标来进行使用,先遍历字符串,统计字符串中每一种元素出现的次数。 分情况讨论: 偶数 偶数的情况好考虑,直接将其数量添加到最长回文串的总数量上 奇数 奇数的情况要考虑,其实类似bbabb这样结构也是被允许的,说明在回文串中允许出现一个奇数,其他奇数再次出现时,只能保留其2的倍数个 实现代码 bool cmp(const int a,const int b){ return a>b; }
2021-03-20 10:19:07
114
原创 【刷题基础知识】-哈希表
哈希表的概念 桶排序 由于通常排序的时间复杂度都是O(nlog(n)),当需要的表长不长,排序的元素集中在一个数据范围内,这种排序的时间更优 总结 字符哈希和正整数的哈希是有取值范围的 通用的方法 头插法的好处不需要额外遍历到尾部,需要额外开辟空间设置 表长一般取质数会使哈希表比较分散 节点维护开辟内存的工作一般放在算法之外维护比较好 遍历vector来释放new的空间 哈希有两种应用 元素出没出现 元素映射为新元素 ...
2021-03-20 09:36:07
169
原创 【LeetCode70】-爬楼梯
方法一(暴力递归) 实现思路 原问题分解为子问题,子问题就是走一步还是走两步,走一步就多增加一种走法,走两步就增加两种走法 实现代码 一种遍历的写法 void solve(int n){ if(n== 1 || n==2){ return n; } return solve(n-1)+solve(n-2); } 这种情况下的写法之所以没有问题,原因是由于n的最小值一定是1,当为1的时候就会返回,不会出现无限循环的情况 提交结果 分析超时的原因:其实走每一步就是相当于有两种选择,要么走一步要么走两步,最终
2021-03-11 22:16:26
126
原创 【LeetCode449】-序列化和反序列化二叉搜索树
解码和复原的思考: 其实只有前序的序列才可以实现,前序的情况第一个是根节点,所以才方便以此为开端建树 实现思路 字符串转换为二叉树 (1)先将所有字符串按逗号分隔出整数 (2)再利用整数新new节点,将所有的节点都存储在vector中 可以发现题中给出的序列是前序遍历,也就是意味着第一个为根节点,遍历vector中除根节点以外的节点依次开始建树 二叉树转换为字符串 (1)实现将大于等于1位的整数转换为字符串 (2)转换之前先拼接[ (3)转换之后再拼接] (4)中间过程记得除了第一位,都在前面加上,此过
2021-03-10 19:31:56
184
原创 【刷题基础知识】-二分查找树
set本身是一个二叉查找树 传递指针的好处: 相当于是在外部进行管理节点,在函数内部只是管理指针的指向 TIP: (一)算法和内存维护最好分开考虑 如果混在一起,就不能单独操作一个节点了,缺少一些灵活性 (二)new的节点记得delete (三)在创建树的时候,可以提前把所有创建好的节点放在vector数组中,然后利用vector数组中存放的节点,一次插入节点创建一个树,这样做的好处在于delete的时候可以直接删除vector即可 ...
2021-03-10 14:40:38
118
原创 【LeetCode33】-搜索旋转排序数组
方法一 实现思路 (一)先遍历数据,如果数据一直单调递增就计数+1,直到第一个不递增的数停止,利用这种方法就可以知道未被翻转的原数据的头部下标t (二)然后将给出的翻转数据排序,然后利用二分查找找出元素是否出现在该数组中,如果在获取下标,因为该数据经过了重新排序,所以我们需要将该数据转换成翻转数据的下标index, 转换公式:(index+t)%nums.size() 总体思路是不破坏二分查找的结构,而将注意力转移到二分查找之后的数据上 实现代码 class Solution { public: i
2021-03-09 09:17:03
100
原创 【PAT1004】-Counting Leaves
实现思路 题目大意就是计算出树的每一层中叶节点的个数 (一)建树 构建树的节点 这一步决定了节点和节点之间的连接关系,在本体中没有提到树是二叉树,所以孩子节点的存储依靠vector存储,为方便存储在里面存放的是节点的id号 存储所有树的节点 由于存储的孩子是id号,且本题中树的个数不超过100,那么直接创建一个105大小的树节点指针的数组,数组的下标正好对应树节点的id号 正常读取数据建树即可 (二)遍历 这里面遍历正常使用递归遍历即可,在遍历的过程中传递层数这一参数,当该节点为叶节点在本层记录
2021-03-08 22:17:56
133
原创 【LeetCode34】-在排序数组中查找元素的第一个和最后一个位置
方法一 实现思路 由于在本题中有重复元素的存在,不能直接使用二分查找 先使用map统计了下每一个元素出现的次数,然后利用set构造了没有重复元素的vector数组,在该数组中进行二分查找,当查找到该元素后,利用map数组中存储的数据,实际计算出数据出现的范围,然后返回结果;当没有找到时,直接返回[-1,-1] 主要思想是二分查找框架上的小拓展 实现代码 class Solution { private: map<int,int> cnt; public: void get_beg
2021-03-08 22:17:29
95
原创 【LeetCode35】-搜索插入位置
实现思路 使用二分查找,利用二分查找循环代码的框架 具体可参照【刷题基础知识】-二分查找 与普通的二分查找不一样的点主要在于这里面不仅要判断是否存在元素,如果找到了该元素要直接返回该位置,如果没有找到要返回该元素正确应该在的位置。 情况可以主要分为两大类 第一类: 找到了该元素,直接返回该元素的下标 第二类: 没有找到该元素,需要再分两种情况 (1)target比终止状态大 在正常的比较中,这个target最后一步是和1比较可以发现target比1大 此时begin=0,end=0,按照算法begin=m
2021-03-08 21:42:31
102
原创 【PAT1003】-Emergency
实现思路 由于是求最短路,我想到了用前向星+SPFA的解法 在求解的过程中注意考虑当两条路的长度相同时,选择累积的消防队最多的那条路 但是提交后: 只通过了第一个测试点 上网找了相关SPFA解法的博客 利用SPFA算法解决PAT A1003 全网最全!PAT甲组1003.Emergency (优先队列实现迪杰斯特拉算法,Bellman算法,SPFA)思路与注意点–补充《算法笔记》 重要警示!!! 不要再脑子不清楚的情况下瞎做题,我一直认为自己的思路没有问题,原来是我没注意题目想要的结果是什么,结果要的不是最
2021-03-06 15:50:22
261
1
原创 【LeetCode207】-课程表
方法一(DFS) 实现思路 将所有的关系抽象为有向图,图的结点代表的是课程,有向边代表的是两者之间的先后关系 核心思想: DFS+访问状态 访问状态的设置: (1)-1代表没有访问 (2)0代表当前正在访问的结点 (3)1代表已经访问过 大体步骤: (一)初始化,初始化所有结点的初始访问状态为-1,建立邻接表 (二)遍历所有尚未访问的点进行DFS,此时如果DFS返回false代表有环,否则都遍历完返回true DFS的核心逻辑 DFS初始时标记当前的结点状态为0,遍历完所有邻居结点后状态设置为-1 在遍历邻
2021-03-03 22:10:27
282
2
原创 【LeetCode199】-二叉树的右视图
实现思路 总体思路是要压入节点及层数,层数其实就是该节点的父节点的层数+1 实现代码 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : v
2021-03-03 14:59:11
141
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅