- 博客(21)
- 收藏
- 关注
原创 找零钱问题
322. 零钱兑换518. 零钱兑换 II//dpint coinChange_dp(vector<int>& coins,int amount){ int n = coins.size(); //dp[i][j] : coins[0..i]元素替换成j的方法种数 vector<vector<int>> dp(n,vector<int> (amount+1)); //初始值:只用coins[0]替换 dp[0][j
2021-08-11 18:26:46
153
原创 Horspool算法
一、算法思想空间换时间把模式Pattern和文本Text的开头字符对齐,从模式的最后一个字符开始比较,如果尝试比较失败了,把模式向后移。向后移动的距离是查已构造好的移动表获得。每次尝试过程中比较是从右到左的。移动表的构造可以仅使用模式串Pattern,设字符c是文本Text中对齐模式串的最后一个字符的元素,那么在每次匹配失败时,就根据字符c查找移动表来确定移动距离(不管字符c和模式串的最后一个字符是否匹配)。对于每个字符c,可用以下公式算出移动距离:#include <iostream>
2021-07-02 12:05:26
822
原创 约瑟夫问题
int main(){ int n,m; cin>>n>>m; vector<bool> in(n+1,true); int last = 0; // 一次out一个 for(int i=1;i<=n;++i){ int cnt = 0; // 每次都必须报够m个数 while(cnt<m){ last++; if(l
2021-01-23 22:45:55
148
原创 奇偶校验(转换二进制、bitset)
输入一个字符串,然后对每个字符进行奇校验,最后输出校验后的二进制数(如’3’,输出:10110011)。https://blog.youkuaiyun.com/meng_lemon/article/details/89060740七位二进制可表示所有字符的十进制ASCII码(0~127)。int main() { string s; vector<int> res(8); //7位二进制数表示字符的ASCII码,最高位为奇偶校验位 while (cin >> s)
2020-10-08 14:24:52
1508
1
原创 sort自定义排序
参考:https://blog.youkuaiyun.com/weixin_41588502/article/details/86620305?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai
2020-10-08 10:06:46
364
1
原创 由数组创建完全二叉树和二叉树的遍历
一、前序遍历//递归前序遍历void preorder(node*& root) { if (root == NULL) { return; } cout << root->val << ' '; //访问根节点 preorder(root->left); preorder(root->right);}//非递归前序遍历//借助栈,先压入根节点,每访问一个节点时出栈,然后先压右子树,再压左子
2020-10-07 22:51:11
532
原创 二叉排序树的创建查找与插入(C++)
一、创建(插入):递归node* insert(int x,node* pnode) { if (pnode == NULL) { pnode = new node(x); return pnode; } else { if (x < pnode->val) { //等于根节点不能插入! pnode->left = insert(x,pnode->left); }
2020-10-07 09:45:11
600
原创 大整数加法和乘法、浮点数加法
1.javapublic class sum{ public static void main(){ Scanner cin = new Scanner(System.in); while(cin.hasNext()){ BigInteger a = cin.BigInteger(); BigInteger b = cin.BigInteger(); BigInteger s = a+b; System.out.println(s); } }}2.c++数组模
2020-10-05 15:06:08
218
原创 vector数组中size函数的返回值问题
刷题时遇到下面的问题,此段代码会死循环! 问题在于size()函数的返回值!vector<int> nums{ 2,1 };for (int i = nums.size()-1; i >= nums.size()-2; i--) { //int res = nums[0]; //cout << res <<' '<< nums.size()<< endl; }std::vector::siz
2020-10-03 22:49:34
2475
原创 C++二维数组排序(sort)、sort中调用comp的一些注意
bool cmp(vector<int>& a, vector<int>& b) { return a[2] < b[2];}int main(){ vector<vector<int> > v = { {4,9,6},{1,2,3},{7,1,9},{10,0,6} }; //sort(v.begin(), v.end());//默认按每行第一个元素排序 sort(v.begin(), v.end(),cmp); for
2020-10-02 14:14:41
2210
原创 基于顺序结构和单链表的各种排序算法C++实现
1.直接插入排序时间复杂度O(n^2) 空间复杂度O(1)稳定:不会改变相等元素的相对位置。适用于顺序存储和链式存储。算法描述: L[1…n]初始L[1]是一个已经排好序的子序列;将L(i)(L[2…n])插入到已排好序的子序列 :(1)查找出L(i)在L[1…i-1]中的位置k;(2)将L[k…i-1]中的所有元素后移一位;(3)将L(i)复制到L(k)基于顺序存储的直接插入排序://直接插入排序(顺序存储)void straisort(vector<int>&
2020-09-26 10:20:59
1706
原创 最短路径C++( 广度优先搜索、Dijkstra算法和Floyd算法)
一. 单源最短路径(single - source shortest path)基于图的邻接矩阵存储。单源最短路径是指从一个顶点到其它各顶点之间的最短路径(single - source shortest path)。迪杰斯特拉(E.W.Dijkstra)于1959年提出了一个寻找单源最短路径的方法。其基本思想是,设置一个顶点集合S,并不断地作贪心选择来扩充这个集合。该算法属于算法设计方法中的贪心算法(greedy selector)类——总是作出当前看来最好的选择,通过获取局部最优,最终达到获取
2020-09-12 11:24:03
4413
原创 图的拓扑排序及关键路径C++实现(基于邻接表)
AOV网:顶点表示活动,弧表示活动间的优先关系的有向图。无有向环。AOE网:顶点表示事件,弧表示活动,权表示活动持续的时间的有向无环图。1.拓扑排序(AOV网)const int MAX_VERTEX_NUM = 20;//图的邻接表存储:对图的每个顶点建立一个单链表。需要两种类型的节点。一种是表头节点(数量=图的顶点数),以向量形式存储,以便随机访问任一顶点的链表;//一种是与表头节点表示的顶点邻接的顶点,链接到相应表头节点后面//与表头节点表示的顶点邻接的顶点的节点,包括一个顶点的数据域ad
2020-09-10 21:33:34
1276
原创 图的构造与表示(邻接表)及遍历(深搜和广搜及其应用)
struct GraphNode { int label; vector<GraphNode*> neighbors; GraphNode(int x) : label(x) {};};void DFS_Graph(GraphNode* node, int visit[]) { //数组作参数传给函数时,传的是指针 visit[node->label] = 1; printf("%d", node->label); for (int i = 0; i < n..
2020-09-10 11:45:44
795
1
原创 最小生成树之PRIM算法&Kruskal算法C++代码(详细注释)及复杂度分析
最小生成树之PRIM算法C++代码实现:#include <iostream>#include <vector>using namespace std;void prim(vector<vector<int>>& VGraph, vector<int>& lowcost, vector<int>& closest, vector<bool>& visited) { int si
2020-09-07 16:37:10
2648
原创 C++结构体指针做函数参数不会改变实参的值
参考 https://blog.youkuaiyun.com/c991262331/article/details/83274525在做一道经典的深度优先搜索二叉树的题目时遇到一个问题,即C++中将结构体指针作为参数传递时,并不会改变实参的值!原因是当结构体指针传递给函数时,会拷贝一份指针的值,但是函数内部的指针和函数外部的指针并不是指向同一个引用的,所以才会使得函数里面改变了,但是函数外部无变化,解决方案是在传参的时候,将结构体指针的引用传递过去。class Solution {public://算法:/
2020-09-01 16:21:26
1824
5
原创 回溯算法:子集、排列、组合的实现区别
参考:https://leetcode-cn.com/problems/subsets/solution/hui-su-si-xiang-tuan-mie-pai-lie-zu-he-zi-ji-wen-t/https://leetcode-cn.com/problems/combination-sum/solution/hui-su-suan-fa-jian-zhi-python-dai-ma-java-dai-m-2/子集问题可以利用数学归纳思想,假设已知一个规模较小的问题的结果,思考如何推导出原问
2020-08-31 21:42:12
545
原创 回溯算法递归调用过程解析
解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题:1、路径:也就是已经做出的选择。2、选择列表:也就是你当前可以做的选择。3、结束条件:也就是到达决策树底层,无法再做选择的条件。代码方面,回溯算法的框架:result = []def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) returnfor 选择 in 选择列表: 做选择 backtrack(路径, 选择列
2020-08-29 17:00:39
1700
1
原创 C++——右值引用和move语义解析
C++——右值引用和move语义的理解文章目录C++——右值引用和move语义的理解1.前言2.左值和右值3.左值引用4.右值引用5.move(移动)语义6.总结7.参考资料1.前言 在C++学习过程中,C++11的一个新特性——右值引用引起了我的关注,而且在此之前我对于C++中的左值和右值的概念比较模糊,因此在理解左值和右值的基础上,我对C++中的右值引用以及move语义进行了学习研究。2.左值和右值**左值 (lvalues):**指可以放在赋值号左边,可以被赋值的值;左值必须要在内存中有
2020-08-17 11:14:04
1098
原创 动态规划-01背包/完全背包/多重背包问题详解
0-1背包问题给定一组多个(n)物品,每种物品都有自己的重量(wi)和价值(vi),在限定的总重量/总容量(C)内,选择其中若干个(也即每种物品可以选0个或1个),设计选择方案使得物品的总价值最高。eg:背包容量C=8,物品num价值vi重量wi112223354465贪心算法无法得到最优解。 易举反例。动态规划:确定状态:dp[i][j] 表示只考虑n件物品中的前i件物品中,在背包承重为j的前提下,能拿到的最大价值。如dp[3][
2020-08-15 23:49:39
691
原创 动态规划—leetcode三角形最小路径和详解
题目:给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。解题过程:(1)原问题与子问题:原问题为求第一行到最后一行最小路径和。将其划分为子问题:第n-1行/第n-2行/…第i行
2020-08-13 17:54:08
680
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人