
初级算法
fengyun_w
这个作者很懒,什么都没留下…
展开
-
kmp 算法
#include<string>#include<iostream>using namespace std;vector<int> getnext(string s) { vector<int> next(s.size(),0); next[0] = 0; int j = 0; for (int i = 1; i < s.size();i++) { if (j > 0 && s.原创 2021-07-15 10:50:31 · 141 阅读 · 0 评论 -
c 实现堆排序 建立堆
堆排序过程:1.通过数组建立一个堆,升序排序建立大根堆,降序排序建立小根堆;2.每次调整完一次,将最大的跟=根节点的值换到数组最后一个位置,然后重新调整【0~n-1】为一个新的大根堆,以此排序。代码:#include<iostream>#include<stdio.h>#include<queue>#include <vector...原创 2020-03-30 00:29:30 · 348 阅读 · 0 评论 -
使用STL priority_queue 解决topk 问题
思想:priority_queue 底层是由堆实现的,所以使用堆这种数据结构,时间复杂度n*lg(k)(假设n个数据都要调整,且堆的调整复杂度为堆的高度lg(k)),空间复杂度k。代码如下:#include<iostream>#include<stdio.h>#include<queue>#include <vector>usin...原创 2020-03-29 12:49:37 · 889 阅读 · 0 评论 -
两个栈实现一个队列
解析:栈的特点是“先进后出”,队列的特点是“先进先出”。由此,可以将一个栈用来add值,另一个用来del值。现将数插入stack1,然后将stack1中的数push到stack2,此时由于栈1先进后出,此时数据已被颠倒,stack2进行pop,就可以了。代码:#include<iostream>#include<stack>using namespace std;te...原创 2018-06-11 18:58:52 · 174 阅读 · 0 评论 -
两个队列实现一个栈
解析:我们设定s1是入栈的,s2是出栈的入队列:直接压入元素至s1即可出队列:如果s2不为空,把s2中的栈顶元素直接弹出。否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素代码:#include<iostream>#include<queue>using namespace std;template<typename T>class Sta...原创 2018-06-11 19:22:44 · 271 阅读 · 0 评论 -
数据查找之二分查找(递归和非递归)两种写法
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。 它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果x<a[...原创 2018-06-13 19:46:28 · 1022 阅读 · 0 评论 -
快速排序(递归和非递归)
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序适用于大量数据进行排序。(1)如果每次将数组一分为二,此时排序就是最优:最优情况下时间复杂度为:O(nlogn)最优情况下空间复杂度为:O(logn)(2)如果每次选取的基准是...原创 2018-06-15 11:54:23 · 1673 阅读 · 0 评论 -
旋转数组中找最小值
概念:旋转数组就是,将一个排序数组的前n位数挪到数组的后面,我们称之为旋转数组。例如数组{3,4,5,1,2}就是数组{1,2,3,4,5}的一个旋转。分析:找出一个数组中最小的数并不难,只需遍历数组即可,但是次方法的时间复杂度为O(n),而且没有利用旋转数组的特性。解决:我们注意到旋转后的数组实际上可划分为两个排序的数组,而且前面的子数组的值都要大于或等于后面的子数组的元素。并且最小的元素恰好是...原创 2018-06-17 20:37:44 · 679 阅读 · 0 评论 -
剪绳子问题
问题:现有一根长度为N的绳子,需要你剪成M段,使M段的乘积最大。(其中M、N都为整数,剪成的每段长度也为整数,N已知,M未知)动态规划:首先定义函数f(n)把长度为n的绳子简称若干段后各段的乘机的最大值求出。,剪第一刀的时候有n-1中方法,也就是剪出来第一刀的长度可能为1,2,3,...n-1,因此f(n)=f(i)*f(i-1);当长度<2;max=0;当长度=2;max=1;当长度=3;...原创 2018-06-29 01:25:27 · 887 阅读 · 0 评论