![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法
文章平均质量分 52
算法
baixiaofei567
如果十年前没种树,那最好的时间是现在
展开
-
位运算小技巧
基本原理0s 表示一串 0,1s 表示一串 1。x ^ 0s = x x & 0s = 0 x | 0s = xx ^ 1s = ~x x & 1s = x x | 1s = 1sx ^ x = 0 x & x = x x | x = x利用 x ^ 1s = ~x 的特点,可以将一个数的位级表示翻转;利用 x ^ x = 0 的特点,可以将三个数中重复的两个数去除,只留下另一个数。1^1^2 = 2利用原创 2021-04-02 01:28:27 · 155 阅读 · 0 评论 -
递归和尾递归的区别和原理(转)
转载自https://blog.csdn.net/zcyzsy/article/details/77151709递归和尾递归的区别和实现基本上大多数C的入门教材里都会说简单的递归,例如求阶乘n!,经典的本科入门书籍谭浩强的《C语言程序设计》,但后来看了《代码大全2》这本书,关于进阶和编码规范的书中提到了,这些计算机教材用愚蠢的例子阶乘和斐波那契数列来讲解阶乘,因为递归是强有力的工具,但用阶乘去计算阶乘之类的,很不明智,除了速度慢,还无法预测运行期间内存的使用情况,而且递归比循环更难理解。该书说的这些点,转载 2021-03-20 00:37:57 · 275 阅读 · 0 评论 -
树的三序遍历(迭代)
先序class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; if(root == nullptr) res; stack<TreeNode*> sta; sta.push(root); while(!sta.empty()){ root原创 2021-03-09 23:07:14 · 252 阅读 · 1 评论 -
手写七大排序以及注释(C++)
#include<iostream>#include<vector>#include<ctime>using namespace std;//选择排序,每次选择最小的元素,将它与数组的第一个元素交换位置,再再从数组剩下的元素中选择出最小的元素,将它与第二个元素交换位置。不断进行这样的操作,直到将整个数组排序 //就算有序也要O(n^2)时复 //不稳定 void Select_sort(vector<int>& nums){ //最后原创 2021-03-06 13:11:56 · 224 阅读 · 0 评论 -
固定长度的洗牌算法
1.背景笔试时,遇到一个算法题:差不多是 在n个不同的数中随机取出不重复的m个数。洗牌算法是将原来的数组进行打散,使原数组的某个数在打散后的数组中的每个位置上等概率的出现,刚好可以解决该问题。2.洗牌算法由抽牌、换牌和插牌衍生出三种洗牌算法,其中抽牌和换牌分别对应Fisher-Yates Shuffle和Knuth-Durstenfeld Shhuffle算法。2.1Fisher-Yates Shuffle最早提出这个洗牌方法的是 Ronald A. Fisher 和 Frank Yates,即原创 2020-10-25 00:33:55 · 208 阅读 · 0 评论 -
二叉树遍历的迭代模板(完全模仿递归)
思路:递归的本质就是压栈,了解递归本质后就完全可以按照递归的思路来迭代。怎么压,压什么?压的当然是待执行的内容,后面的语句先进栈,所以进栈顺序就决定了前中后序。我们需要一个标志区分每个递归调用栈,这里使用nullptr来表示。先序遍历看懂了,中序和后序也就秒懂。先序遍历class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res;原创 2020-08-23 22:59:46 · 301 阅读 · 0 评论 -
优先队列&堆排序
优先队列原创 2020-08-17 15:08:29 · 152 阅读 · 0 评论 -
快速排序
快速排序引人注目的特点包括它是原地排序(只需要一个很小的辅助栈)且长度为N的数组排序所需的时间和NlgN成正比缺点:非常脆弱,需要小心才能避免低劣的性能。基本算法快排是一种分治的算法,快排把数组切分成两个小数组,切分点左侧的都比切分点小,右侧的都比切分点大,左右子数组均有序,大数组也就有序了。class Quick{ public: void quick_sort(int a[]){ random.shuffle(a,a+a.size());//消除对输入的依赖 sort(a,0,原创 2020-08-15 23:21:30 · 100 阅读 · 0 评论 -
回溯算法
照搬labuladong,有需要直接百度这位大佬即可废话不多说,直接上回溯算法框架。解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题:1、路径:也就是已经做出的选择。2、选择列表:也就是你当前可以做的选择。3、结束条件:也就是到达决策树底层,无法再做选择的条件。如果你不理解这三个词语的解释,没关系,我们后面会用「全排列」和「N 皇后问题」这两个经典的回溯算法问题来帮你理解这些词语是什么意思,现在你先留着印象。代码方面,回溯算法的框架:result = []def b原创 2020-08-14 23:52:59 · 134 阅读 · 0 评论 -
归并排序
归并即将两个有序的数组归并成一个更大的有序数组。**优点:**能够保证将任意长度为N的数组排序所需时间和NlogN成正比。**缺点:**所需的额外空间和N成正比。原地归并的抽象方法实现归并的一种直接了当的方法是将两个不同的有序数组归并到第三个数组中。实现方法就是创建一个适当大小的数组,将两个数组一个个从小到大放入大数组中。但是!!!当用归并将一个大数组排序时,需要进行多次归并,每次归并都创建一个新数组就太浪费内存了。所以需要原地归并,这样就可以先将前半部分排序,再将后半部分排序。下面的代码还是用原创 2020-08-13 23:41:33 · 120 阅读 · 0 评论 -
初级排序算法
选择排序在数组中找到最小的元素,将其和第一个元素交换位置。再从剩下的元素中找到最小的元素,和第二个元素交换位置。如此往复,直到将整个数组排序,这种方法叫选择排序,因为它在不断地选择元素之间的最小者。每次交换都排定一个元素,所以交换的总次数为N。所以算法的时间效率取决于比较的次数class solution{ void sort(int compare[]){ int N = compare.size(); for(int i = 0; i<N; i++) { int min原创 2020-08-13 11:44:54 · 101 阅读 · 0 评论 -
滑动窗口算法技巧
一、滑动窗口的概念顾名思义,就像一个滑动的窗口,套在一个序列中,左右的滑动,窗口内就是一个内容集。二、滑动窗口算法思路滑动窗口的应用场景有几个特点:需要输出或比较的结果在原数据结构中是连续排列的;每次窗口滑动时,只需观察窗口两端元素的变化,无论窗口多长,每次只操作两个头尾元素,当用到的窗口比较长时,可以显著减少操作次数;窗口内元素的整体性比较强,窗口滑动可以只通过操作头尾两个位置的变化实现,但对比结果时往往要用到窗口中所有元素。...原创 2020-08-03 00:26:09 · 289 阅读 · 0 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 1:输入: [0,1,3]输出: 2示例 2:输入: [0,1,2,3,4,5,6,7,9]输出: 8class Solution {public: int missingNumber(vector<int>& nums) { int i; for(i=0; i&原创 2020-07-31 23:28:59 · 104 阅读 · 0 评论 -
辗转相除法(求最大公约数)
最大公约数,最小公倍数求法 参考https://blog.csdn.net/special_hg/article/details/52450073用代码来描述就是long long int gcd(long long int a,long long int b){ return b==0 ? a:gcd(b,a%b);}原创 2020-07-22 20:26:45 · 408 阅读 · 0 评论 -
C++一些取整操作
函数名称 函数说明 2.1 2.9 -2.1 -2.9Floor() 不大于自变量的最大整数 2 2 -3 -3Ceil() 不小于自变量的最大整数 3 3 -2 -2Round() 四舍五入到最邻近的整数2 3 -2 -3floor()和ceil()均为中的函数floor()是取不大于自身的最大整数ceil()是取不小于自身的最小整数round()要自己实现如果你要输出经过四舍五入的小数,直接输出是肯定会出错的。in原创 2020-07-20 15:40:09 · 361 阅读 · 0 评论 -
判断素数
bool isprimer(int x){ if(x==1) return false; int Sqrt=sqrt(double(x)); for(int i=2;i<=Sqrt;i++){ if(x%i==0) return false; } return true;}原创 2020-07-19 22:08:14 · 140 阅读 · 0 评论 -
字符串与数字的转化
1002 写出这个数 (20分)char和int的转化:char c='1';int n=1;n=c-'0'数字的对应的字符-‘0’就是那个数字的int形式string和int的转化int sum=0;string num = to_string(sum);to_string函数包含在头文件中int和string的转化string num="123";int sum=stoi(num);stoi函数包含在头文件中大小写字母的转化'b'='B'-'A'+'a原创 2020-07-19 22:07:49 · 114 阅读 · 0 评论 -
reverse函数
1008 数组元素循环右移问题 (20分)m=m%n; if(m!=0){ reverse(begin(arr),end(arr)); reverse(begin(arr),begin(arr)+m); reverse(begin(arr)+m,begin(arr)+n); }如果是普通的数组可以用1.reverse(a,a+n)2.reverse(begin(a),begin(a)+n)如果是字符串1.reverse(a.beg原创 2020-07-19 21:01:59 · 458 阅读 · 0 评论