数据结构与算法
skyinmoon
编程是建筑,代码是砖头,一砖一瓦,细致谨慎。
展开
-
加了限制条件的动态规划
动态规划有时候会加各种限制条件,但其实总的套路是不变的,只需要在其中加一些条件,并可能需要进行数据的预处理。题目:购物单问题====================================================王强今天很开心,公司发给N元的年终奖。王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:原创 2017-05-14 16:52:05 · 1815 阅读 · 0 评论 -
正则表达式匹配
题目:实现支持'.'和"*"的正则表达式匹配'.'匹配任意一个字母'*'匹配0个或者多个前面的字符。匹配应该覆盖整个输入字符串而不是仅仅一部分。如字符串“aaa”与模式"a.a"和"ab*ac*a"匹配,而与"aa.a"及"ab*a"均不匹配。思路:首先要理解题意(想了好久才了解这个题目的意思)。这个说的是两个字符串要完全相等。意思就是判断是否能用含有'.'和"*"的字符串原创 2017-06-24 00:08:26 · 731 阅读 · 0 评论 -
筛选法求N范围内的所有素数
先把N个自然数按次序排列起来。1不是质数也不是合数,所以排除1,从2开始。2是质数留下来,把后面能被2整除的数全部删除;接着留下来的第二个素数是3,把后面能被3整除的数删除;依次后移,直到N。我用操作最简单的vector容器实现,看代码:#include #include using namespace std;int main(){ int n; cin>>n; if(n<=1)原创 2017-06-23 16:50:16 · 3652 阅读 · 0 评论 -
二叉树重建
二叉树重建是涉及到二叉树知识点中肯定会遇到的问题。前序加中序遍历,或者中序加后序遍历可以唯一地重建一棵二叉树。如:给定前序遍历数组{1,2,4,7,3,5,6,8},中序遍历数组{4,7,2,1,5,3,8,6},然后重建一棵二叉树;思路:在前序遍历数组中第一个数肯定是树的根root->val=1,然后根据root在中序数字的位置可以划分出左子树和右子树的中序遍历,同样又可以知道左子树和右原创 2017-06-28 16:53:05 · 621 阅读 · 0 评论 -
队列(queue)的模板类及其成员函数的实现
队列(queue)是先进先出的数据结构,存储方式可以是数组也可以是链表。如果用数组存储,一般采用循环队列的方式。所以需记住几个关键点:队头指针进1:front = (front+1)%maxsize队尾指针进1:rear = (rear+1)%maxsize判断队空:front = rear判断队满:front = (rear+1)%maxsize,这里,队满的时候队尾和队头之原创 2017-06-06 12:21:28 · 7009 阅读 · 0 评论 -
栈(stack)的模板类及成员函数的实现
容器类的数据结构都是用模板类构成的,包括栈(stack),队列(queue),向量容器(vector),双端队列(deque)等。下面实现的是栈的模板类构成。定义头文件#include#includeusing namespace std;const int stackIncreament=20;templateclass SeqStack{public: SeqStack原创 2017-06-06 09:58:41 · 4279 阅读 · 0 评论 -
回溯算法
递归真的不大好理解,而且很难自己写出来,但是我发现牛逼的算法都会用到递归=_=不知道到底是什么样的人才能发明递归这种东西,他的脑神经是不是用二进制构成的=_=言归正传回溯算法是一种做决策的算法,也叫试探法。基本思想是:按一条路往前走,能进则进,不能进则退回来换一条路再试。回溯一般可以用树的概念来描述。回溯法就是从树的根节点出发(注意:根节点不包含任何元素,根节点的子节点包含所有元素,这样才原创 2017-05-07 15:06:31 · 363 阅读 · 0 评论 -
动态规划
大公司的笔试题基本都会用到动态规划来求解最优化问题,所以必须熟练掌握这个算法。其实很多牛逼的算法,比如动态规划,回溯,贪心算法,分支界限等,都讲的是一种思想而已,如果仅仅只了解了这种思想,是没有用的。要理解算法,就必须把它们用在各种实战上,这才是编程的本质。动态规划理论:一个问题可以分解成若干个子问题,将各个子问题最优解组合起来又可以达到问题的最优解(必要条件)。有最优子结构,重叠子问题。原创 2017-05-07 12:08:33 · 439 阅读 · 0 评论 -
算法题:跳台阶
(前几天去面试了一家公司的实习生,被刷了,很忧伤。。。其中有一道本不应该错的跳台阶问题,我要记下来,以示警戒。) 总共有n级台阶,一个人一次可以爬1级也可以爬2级,请问爬完n级台阶总共有多少种方法?这无非就是斐波那契数列问题,天啊,我一紧张,全忘了,直接懵逼。 这也是经典的青蛙跳台阶问题,一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级原创 2016-11-17 21:53:15 · 995 阅读 · 0 评论 -
for循环内嵌递归用于排列组合
今天花了一段时间才理解for循环内嵌递归的运行机理,看了博客http://blog.csdn.net/mikayong/article/details/51706508,其中决定加上自己的一些理解。 首先看代码` void recur(int i,int n){ count++; cout<<”B>”; for(i;i<=n;i++){原创 2017-04-19 11:23:21 · 7631 阅读 · 2 评论