![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
优质算法摘记
进程击序的媛
身体和灵魂,健身与学习,都在路上。
展开
-
增量构造法输出所有子集
给定一个集合,元素为{0,1,2,3,4.。。。。。n},输出所有的子集思路是一次选出一个元素放入到集合A中,A始终保持从小到大顺序,cur记录当前子集中元素个数,下一个递归的子集为A[cur-1] + 1到n中任意选一个数添加在A的末尾,表示子集个数加1.#include using namespace std;void print_subset(int n, int* A, int原创 2017-07-06 16:03:04 · 235 阅读 · 0 评论 -
针对相同元素的快速排序(算法导论7-2)
当考虑到具有与主元素相同的元素存在时,算法将数组分成三部分,分别小于主元素,等于主元素,大于主元素,然后递归排序第一部分和第三部分,重点是该怎样通过一次循环便可以达到划分目的,因为循环越少,常数因子越小:代码如下:#include<iostream>using namespace std;void partition(int A[], int p, int r, int ...原创 2018-07-26 16:57:40 · 3524 阅读 · 0 评论 -
迭代加深搜索求埃及分数
原文出处:http://blog.csdn.net/u014800748/article/details/44998693迭代加深搜索迭代加深搜索(Iterative Deepening Depth-First Search, IDDFS)经常用于理论上解答树深度上没有上界的问题,这类问题通常要求出满足某些条件时的解即可。比如在“埃及分数”问题中要求将一个分数a/b分解成为若干个形如1/d的加数之...转载 2018-03-11 11:30:50 · 232 阅读 · 0 评论 -
辗转相除法求最大公约数
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a%b); }原创 2018-03-11 09:52:41 · 318 阅读 · 0 评论 -
后序遍历二叉树非递归
原文出处:点击打开链接leetcode中有这么一道题,非递归来实现二叉树的后序遍历。二叉树的后序遍历顺序为,root->left, root->right, root,因此需要保存根节点的状态。显然使用栈来模拟递归的过程,但是难点是怎么从root->right转换到root。方法1:对于节点p可以分情况讨论1. p如果是叶子节点,直接输出2. p如果有孩子,且孩子没有被访问过,则...转载 2018-02-21 13:52:14 · 125 阅读 · 0 评论 -
求32位数中有几位非0位及最低非0位和最高非0位的方法
算法摘自http://www.xqbase.com/computer/struct_intro.htm对代码的解释为原创(1) 求一个32位数中有几位非零位的运算——Count32操作: int Count32(unsigned long Arg) { Arg = ((Arg >> 1) & 0x55555555) + (Arg & 0x55555555); Arg =...原创 2018-03-08 20:04:30 · 2818 阅读 · 0 评论 -
二进制输出所有的子集
参考的书是刘汝佳《算法竞赛入门经典》对于一个二进制数,从右往左,第一位代表数字0,第二位代表数字1,第三位代表数字2,以此类推,这样一个二进制数就可以代表一个子集了。例如0100011000110111表示对应的子集为{0,1,2,4,5,9,10,14}最重要的好处是,利用二进制数表示子集,可以很方便的表示集合的交并补运算。二进制数的&对应交运算,|对应并运算,ALL_BITS^A对应补原创 2017-07-06 17:14:14 · 683 阅读 · 0 评论 -
next_permutation求下一个排列的原理
stl的next_permutation方法,实现求下一个全排列。这里mark一下,告诉自己有这么个函数,原理如下出处http://blog.csdn.net/qq575787460/article/details/41215475这篇文章的例子有点小问题不过这不是重点啦最近刷leetcode的时候遇见next permutation这道题,感觉挺有意思的一个题转载 2017-07-06 15:14:19 · 379 阅读 · 0 评论 -
时间复杂度O(nlgn)求解最长递增子序列问题
#include <iostream>using namespace std;const int maxn = 100;int min_end[maxn]; //min_end[i]表示长度为i的子串的最小末端int pre[maxn];//pre[i]表示第i个结点的前驱结点的索引int index[maxn]; //当前找到的长度为i的递增子序列的最小末尾的索引in...原创 2018-08-11 22:10:30 · 1351 阅读 · 0 评论