
算法
davelam1991
用代码书写青春。
展开
-
算法考试填数字问题
在算法考试中的最后一题,题目为:对于任意一个数字n,我们有一个长度为2n的数组,我们需要把1~n个数填入这个数组里2次。填入数字的规则如下:当填入数字n时,另一个n必须与当前的n距离为n,例如两个1之间要夹着一个数字,两个2之间要夹着两个数字,如此类推,直到把2n个空格填满。现在我们要设计一个算法,我们求出n个数字的所有排列方式。我的算法思想如下:既然两个n之间的距离为n,我们应该从n开始填入原创 2012-09-26 00:34:17 · 1515 阅读 · 0 评论 -
LeetCode之Jump Game II
在LeetCode上刷的第三题,尝试了几种方法,最后还是选择贪心,复杂度为O(n),个人感觉有不少的收获。该题的题目是这样的,给定一个非负整数数组,每个元素代表着在当前位置最大能跳多少步,而我们的目标是从第一个位置开始,通过最少的步数到达最后一个位置。例如,给定数组是 A = [2,3,1,1,4],则只需两步就能到达终点(第一个位置跳1步到达第二个位置,第二个位置上跳三步到达最后一个位置)。首原创 2015-08-27 11:17:24 · 612 阅读 · 0 评论 -
LeetCode之Longest Substring Without Repeating Characters
这次的题目是找出字符串中最长不重复子串,一开始还以为跟最长匹配子串类似,需要用到动态规划呢,结果还是自己想太多了,偷看了一眼Tag,才发现只需要用hashmap和两个指针就能搞定。算法的主要思想是:初始化两个指针head和tail,分别指向字符串初始位置0,并初始化一个hashmap,key为考察中的字符,value为对应字符所在位置。然后一个while循环,直至tail到达字符串尾部,在循环原创 2015-08-30 15:42:18 · 588 阅读 · 0 评论 -
LeetCode之Generate Parentheses(C++)
题目:Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.For example, given n = 3, a solution set is:"((()))", "(()())", "(())()", "()(())", "(原创 2015-10-27 18:07:07 · 845 阅读 · 0 评论 -
dancing links解决X问题的C++实现
X问题,也称精确覆盖问题,就是给定一个01矩阵,需要从中选取一些行组成一个子矩阵,这个子矩阵的每一列有且仅有一个1。这个问题听起来就知道很难,必须使用回溯算法来解决,但是我们知道回溯算法要提高效率,就必须做好剪枝和回溯恢复的工作。这时算法大师Donald E.Knoth给出了一个巧妙的数据结构,十字链表,每个节点都有上下左右的指针。其实这个结构参考的是双链表删除和恢复的便利性,思考一下,在双链表中原创 2015-11-13 22:18:06 · 1666 阅读 · 0 评论 -
Leetcode之Trapping Rain Water
题目原意:给定一个整数数组,每个数代表一个柱子的高度,然后求下雨后这些柱子能储多少水,例如数组[0,1,0,2,1,0,1,3,2,1,2,1]对应的示意图如下:解题思路:四次遍历,第一次遍历获取height最大值top,然后构造一个数组incre_height,长度和height一样,除了第一个和最后一个数和height一样,其他均是top,第二次遍历incre_height,判断当原创 2015-11-23 16:09:48 · 599 阅读 · 0 评论 -
Next Permutation之字典序法
字典序法是求出当前数组在字典序下的下一个数组,也就是正好比当前数组稍大的下一数组。笔者是从《组合数学》中看到的算法,但当时并没有深入思考,而当在leetcode上看到了next permutation才知道该算法的经典。算法的思路如下:(1)求满足下列不等式的最大的j,记为i, 即i=max{j | nj-1(2)求满足下列不等式的最大的k,记为h,即h=max{k | ni-原创 2015-11-29 12:24:08 · 705 阅读 · 0 评论 -
LeetCode之Climbing Stairs与斐波那契数列的联想
题目:You are climbing a stair case. It takes n steps to reach to the top.Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?看到题目之后,毫不犹豫想出公式:f(n)=原创 2016-01-03 21:56:35 · 1059 阅读 · 0 评论 -
LeetCode之Binary Tree Maximum Path Sum
题目:Given a binary tree, find the maximum path sum.For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connection原创 2016-01-27 09:28:37 · 634 阅读 · 0 评论 -
LeetCode之Intersection of two linked list不同方法
AC完看答案发现答案超简单,而自己的方法有点过于复杂了,题目原意是找出两个链表第一个公共节点,如果没有则返回NULL。看到题目后,我竟然想到可能存在交叉结构,结果通过反转一个链表来求出是否存在公共节点,但是却没法求出第一个公共节点,因此重新看回题目,发现根本不可能有交叉结构嘛,这是链表啊,一个节点怎么可能有多个next节点呢,两个链表如果有公共节点,其尾节点必然相同。不过,既然已经写了那么多了原创 2016-02-22 16:14:27 · 681 阅读 · 0 评论 -
Leetcode之Longest Valid Parentheses
好久没来更新Leetcode题目了,因为之前都去刷lintcode了,结果发现还是leetcode是我的本命啊~~第二次刷leetcode,感触良多,有些题目以前不会现在会了,但是有些以前明明会的,现在反而想很久,还有可能需要看提示,而且复杂度还比以前的高了,感觉人变笨了,肯定因为很久没来更新博客的原因。嗯,所以今天就讲一讲Longest Valid Parentheses这道题吧。今天重原创 2016-09-27 16:25:48 · 540 阅读 · 0 评论 -
Simplex单纯性算法的Python实现
单纯性算法是解决线性规划的经典方法,上世纪50年代就提出了,其基本思想是在可行域内沿着边遍历所有的顶点,找出最优值,即为算法的最优值。算法的执行过程如下:求出初始基向量构建单纯性表格在所有非基向量对应的c中,找出一个最小的ci,若该ci大于0,则退出,输出obj,否则将ai入基利用基向量组线性表示ai,得到该线性表示的系数向量Λ对于Λ中所有大于0的分量,求出minmj=1bjΛj对原创 2014-12-19 22:28:16 · 5644 阅读 · 6 评论 -
Python递归求矩阵的行列式
为了感受Python的列表生成器的威力,写了个简单的程序——递归求矩阵的行列式,效率可能没numpy高,欢迎各位指正。def det(m): if len(m) <= 0: return None if len(m) == 1: return m[0][0] else: s = 0 for i in ran原创 2015-01-01 14:54:13 · 4989 阅读 · 0 评论 -
CMU算法求网络瓶颈链路
又到了工作总结的日子了,这一个月来主要的工作就是围绕着求网络瓶颈链路展开,这里的求瓶颈链路是指知道端到端的性能来预测中间哪一环链路是瓶颈。对于这一问题,目前有三种算法,第一个是比较当前边与所有相邻边速度,如果当前边最小,说明是瓶颈的可能性越大。第二个是求流过当前边所有流的速度的方差,方差越小,瓶颈的可能性越大。第三个是参考一篇论文的算法,叫做CMU,它的目的并不是求出整个网络的瓶颈链路,而是求某条原创 2014-03-22 19:37:07 · 3129 阅读 · 0 评论 -
codejam round1c第二题
前阵子参加了Google的code jam,没有编程功底的人果然过不了第一关,不过事后重新做做还是挺有意思的,例如第一轮第三场的第二题,题目如下:小明玩个游戏,一开始有N个火车车厢,每个车厢里都有字母,现在要组装火车,要求把所有车厢连在一起组成字符串,这个字符串要求相同的字母只能相邻,问现在有几种组装的方式。例如有三个车厢a,a,ab,组装的方式就有123,213两种。题目讲完,现在来分析原创 2014-05-24 13:55:04 · 1667 阅读 · 0 评论 -
Java中利用Math.random()产生服从泊松分布的随机数
众所周知,Java的Math.random()产生的是服从均匀分布的随机数,但是其他分布的应用也相当广泛,例如泊松分布和高斯分布(正态分布),而这些分布Java没有很好的提供(高斯分布可以利用Random类),我们需要自己编写。 首先是泊松分布,这是一个离散型的随机变量分布,比较好弄,此外例如考察一些到达事件的概率时,通常服从泊松分布,因此该分布相当实用。在开始编写之前,先感谢原创 2014-07-13 21:20:17 · 14962 阅读 · 0 评论 -
Max-Min Fairness带宽分配算法
最近再写一个网络仿真器,里面参考了Max-MinFairness算法,这是一种比较理想、公平的带宽分配算法。其思路主要如下:首先是算法的准备,考察某一时刻的网络中所有的flow,由于每条flow都有其各个link,因此可以得到各个link上所有流经的flow,然后开始迭代,各个link都把capacity平均分给所有流经的flow,接着每条flow的速度就等于其最小link分配的带宽,然后每条li原创 2014-07-13 20:45:01 · 5755 阅读 · 0 评论 -
Levenshtein distance最小编辑距离算法实现
Levenshein distance,中文名为最小编辑距离,其目的是找出两个字符串之间需要改动多少个字符后变成一致。该算法使用了动态规划的算法策略,该问题具备最优子结构,最小编辑距离包含子最小编辑距离,有下列的公式。其中d[i-1,j]+1代表字符串s2插入一个字母,d[i,j-1]+1代表字符串s1删除一个字母,然后当xi=yj时,不需要代价,所以和上一步d[i-1,j-1]代价相原创 2014-08-19 21:11:18 · 15476 阅读 · 3 评论 -
优化后的Levensthein distance算法实现
在上一篇文章Levenshtein distance算法实现中,笔者已经讲解了一般最小编辑距离的算法。该算法采用动态规划,时间复杂度是O(m*n),m,n分别为两个字符串的长度,而空间复杂度也是O(m*n),如果使用int作为矩阵元素的类型,则矩阵的占用空间大小为sizeof(int)*m*n,假如两个字符串的长度均为10000个字符,则矩阵大小为400MB,相当可观。参考一个快速、高效的Leve原创 2014-08-20 10:39:39 · 2497 阅读 · 0 评论 -
基于Huffman编码的压缩软件的Python实现
哈夫曼编码是利⽤用贪⼼心算法进⾏行⽂文本压缩的算法,其算法思想是⾸首先统计⽂文件中各字符出现的次数, 保存到数组中,然后将各字符按照次数升序排序,挑选次数最⼩小的两个元素进⾏行连结形成⼦子树,⼦子 树的次数等于两节点的次数之和,接着把两个元素从数组删除,将⼦子树放⼊入数组,重新排序,重复 以上步骤。为了解压,在压缩时⾸首先往⽂文件中填⼊入huffman编码的映射表的⻓长度,该表的序列化字符串,编码原创 2014-11-21 21:55:27 · 7011 阅读 · 0 评论 -
关于Havel算法判断度数序列能否构成简单图的思考
问题描述:Given a list of n natural numbers d1, d2,...,dn, show how to decide in polynomial time whether there exists an undirected graph G = (V, E) whose node degrees are precisely the numbers d1,d2,·原创 2014-11-21 22:16:41 · 5706 阅读 · 0 评论 -
网络流算法Push-relabel的Python实现
网络流的背景我就不多说了,就是在一个有向图中找出最大的流量,有意思的是,该问题的对偶问题为最小割,找到一种切分,使得图的两边的流通量最小,而且通常对偶问题是原问题的一个下界,但最小割正好等于最大流,即切割的边就是最大流中各个path饱和边的一个组合。说得可能比较含糊,这里想要了解清楚还是查阅相关资料吧。最大流最原始最经典的解法就是FF算法,算法复杂度为O(mC),C为边的容量的总和,m为边数。原创 2015-01-02 15:44:44 · 4219 阅读 · 3 评论 -
网络流算法Dinic的Python实现
在上一篇我们提到了网络流算法Push-relabel,那是90年代提出的算法,算是比较新的,而现在要说的Dinic算法则是由以色列人Dinitz在冷战时期,即60-70年代提出的算法变种而来的,其算法复杂度为O(mn^2)。Dinic算法主要思想也是基于FF算法的,改进的地方也是减少寻找增广路径的迭代次数。此处Dinitz大师引用了一个非常聪明的数据结构,Layer Network,分层网络,原创 2015-01-02 16:21:51 · 3457 阅读 · 0 评论 -
博客搬家了,请大家继续关注~
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=21lcucs4283oc原创 2018-05-17 19:42:16 · 652 阅读 · 1 评论