![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Algorithms
文章平均质量分 66
liql2007
Sina微博liql2007
展开
-
寻找波谷
问题:给定数组A[1...n],满足:n>=3, A[1]>=A[2], A[n] >= A[n-1]。若A[i]为波谷,则:A[i-1] >= A[i] 请在O(logN)时间内,找到数组中的一个波谷。分析:根据数据数组的两端的情况,可知:整个区间必存在波谷。要求O(logN),首先想到二分:设区间为【left,right】,满足left>= left+原创 2013-07-22 11:30:57 · 1315 阅读 · 0 评论 -
KMP算法
在KMP算法中,next数组的计算是关键。以下是几种求解next数组的方法:1)个人认为最好理解的方法 void getNext(string str, vector &next){ if(str.empty()){ next.clear(); return; } int len = str.length(); next.resize(len);原创 2013-09-20 11:03:29 · 612 阅读 · 0 评论 -
LeetCode经典题目备忘I
1、有序单链表转平衡BST时间复杂度O(n)BinaryTree* sortedListToBST(ListNode *& list, int start, int end) { if (start > end) return NULL; // same as (start+end)/2, avoids overflow int mid = start原创 2013-09-15 19:49:06 · 1166 阅读 · 0 评论 -
老鼠与毒酒
问题I:有1000桶酒,其中1桶有毒。而一旦吃了,毒性会在1周后发作。现在我们用小老鼠做实验,要在1周内找出那桶毒酒,问最少需要多少老鼠。这是老鼠与毒酒最经典问法。分析:此问题可以用二进制的思想来解答。将1000桶酒编号为0,1,...,999。用10只老鼠分别二进制中的相应位,即第1只老鼠,喝掉编号的二进制表示中右边第一位为1的桶内的酒,即1,3,5,7,。。原创 2013-08-02 11:39:33 · 3045 阅读 · 0 评论 -
鹊桥的长度
问题:@陈利人有n对喜鹊。每一对可以表示为(x,y),x、y是喜鹊的编号,并且任意一对,x总是小于y。(c,d)可以连接在(a,b)之后,当且仅当bps:这里鹊桥的长度为能连接在一起的喜鹊的个数。分析I:在二维上,可以构造一个拓扑图(有向图),边长都为1,然后找出一条最长路径。时间复杂度O(n^2)。分析II:在一维上,先将喜鹊按x排序,原创 2013-08-14 12:32:33 · 1014 阅读 · 0 评论 -
k个数相加和为m的种数
问题I:盒子中有n张卡片,上面的数字分别为k1,k2,...,kn。你有4次机会,每抽一次,记录下卡片上的数字,再将卡片放回盒子中。如果4个数字的和等于m。则你就赢得游戏,否则就是输。直觉上,赢的可能性太低了。请你给出程序,判断是否有赢的可能性。分析:要求的是能够赢得游戏概率,很明显,若能够求出4个数子和为m的种数(记作T),那么赢的概率就为T/n^4。这里,将核心部分扩展为问原创 2013-08-13 16:35:17 · 4664 阅读 · 1 评论 -
和为N的种数——背包变形
问题:给一正数数组A,一正整数n,数组A的元素相加能够得到和为n的种数。例如:数组为[5, 5, 10, 2, 3] ,n 为 15,那么种数就为4,分别为:(5 + 10, 5 + 10, 5 + 5 + 2 + 3, 10 + 2 + 3)。分析:最直接的方法就是枚举,但这样的时间复杂度将是指数级的,太暴力了!其实,这一问题与01背包问题类似。用f[原创 2013-08-07 14:30:23 · 923 阅读 · 0 评论 -
丑数
定义:只包含因子2、3和5的数称作丑数(Ugly Number)。那么丑数依次为:1 2 4 5 8 10 16 20 25 32 40 50 64 80 100 125 128 160 200 250...问题:找出前n个丑数。分析I:最直接,最暴力的方法是单独判断每个数是否是丑数,太丑陋了,这里就不说了。分析II:这个问题,可以用原创 2013-08-12 11:38:56 · 1006 阅读 · 0 评论 -
原地归并
问题I:传统归并排序需要O(n)的空间发杂度,但是否能够实现原地归并排序呢?即O(1)的空间复杂度。时间复杂度还是否是O(logn)?对于这个问题,网上有很多资料,讲的比较清楚的有下面这个帖子:http://www.ahathinking.com/archives/103.html我们知道,无论是基于单个记录的两两归并,还是利用插入排序先得到较长的子序列然后归并,在算法原创 2013-08-03 19:32:42 · 1252 阅读 · 3 评论 -
最长的含有相同数目的01子串 & 括号匹配问题
题目:给定一个字符串,字符串中只包含‘0’和‘1’。请找到一个最长的子串,使得其中0和1的数量是相同的例1:“10101010” 结果就是其本身例2:“0011110”结果是“0011”变形:给定一个字符串,字符串只包含‘(’和‘)’,请找出一个最长的子串,使得该子串满足括号法则。例1:“(()())()()”结果为自身例2:“())()()(”结果为“()()"原创 2013-07-20 09:16:42 · 3049 阅读 · 1 评论 -
三路划分
问题:对一个只可能含有1、2、3三种值的数组,按升序排序。另一种常见问法:有一个只可能含有红、绿、蓝三种颜色的序列,进行分类,使红色都位于最左边,蓝色都位于最右边。解: 实际是对快排中用到的二路划分的扩展——三路划分。设原数组为A, 有n个元素。使用三个指针left, middle, right, 那么A[0]...A[left-1]的值都为1A[left]...A原创 2013-07-21 11:33:07 · 1526 阅读 · 1 评论 -
出界的概率
问题:一个小岛,表示为一个N×N的方格,从(0,0)到(N-1, N-1),一个人站在岛上,位置(x, y),他可以上下左右走,一步一个格子,他选择上下左右的可能性是一样的。当他走出小岛,就意味着死亡。假设他要走k步,请问他死亡的概率有多大?分析I:要求概率,首先想到计算出所有路径的种数N,以及出界的路径种数M,死亡的概率就是N/M了。计算路径种数可以用DP的思想:原创 2013-07-26 12:50:46 · 826 阅读 · 0 评论 -
柱状图中找最大矩形 & 矩阵中找最大的仅含相同值的矩形区域
一、具体题目如下:给一组非负的整数来表示一个柱状图,设计一个算法获得柱状图中最大矩形的面积。比如,输入如下数据:2,1,5,6,2,3 ,其中每个数表示一个柱状条的高度,柱状条的宽度为默认值1,则计算得最大矩形的面积为10。 ==>此问题,在Leetcode中有原题:Largest Rectangle in Histogram算法时间复杂度o(n):class Soluti原创 2013-07-18 11:46:27 · 2802 阅读 · 3 评论 -
N个正整数连接成最大的数
题目:给出N个正整数,如 {7, 959, 95, 71, 1}, 求将这些数连接起来所组成的最大的数,即959957711。变形:给出N个由0...9组成的字符串(开头可能为零),求将这些字符串连接起来,所组成的最大的数。代码:#include #include #include #include using namespace std;string MaxNum原创 2013-07-19 12:58:33 · 1752 阅读 · 1 评论 -
找出会移动的奖品
问题:有n个瓶子,有一个奖品,游戏者需要猜出奖品在哪个瓶子中。有n个黑色的瓶子(以至于游戏中看不到瓶中是否有东西)设从0到n-1编号,一字排开。每一次如果游戏者猜错了,那么奖品会各以50%的概率移动到左边或者右边的瓶子中。当奖品位于最左边或者最右边,游戏者猜错时,奖品必然右移或者左移。请问,游戏者最少需要猜多少次,可以保证猜到奖品位置。ps:好像是网易游戏面试题,比原创 2013-07-24 10:57:24 · 1136 阅读 · 0 评论 -
两道概率面试题
问题一:一根一米长的绳子,随机断成三段;求最短的一段的期望长度以及最长的一段的期望长度。分析:这道题实际是一道纯粹的概率题,没有太多技巧。自己有推导,但是概率论忘得差不多了,退出来的概率有点诡异;以后补充一下知识,再推导。先放一下@陈利人 给出的答案吧,比较简略:绳子的长度分析,有时间,我会补充一个详细的。问题二:52张牌,四张A,随机打乱后问,从左到右原创 2013-07-25 11:43:08 · 2210 阅读 · 0 评论 -
赛马问题
问题:有25匹马,但只有5个跑道,即每场比赛只能五匹一起跑,那么最少需要举行几场比赛,才能确定前三甲呢?分析:首先, 将25匹马分为5组A、B、C、D、E组,每组跑一次,确定出每组的名次;需要跑5场。假设:A1>A2>A3>A4>A5B1>B2>B3>B4>B5C1>C2>C3>C4>C5D1>D2>D3>D4>D5E1>E2>E3>E4>E5即原创 2013-08-01 12:04:18 · 1057 阅读 · 0 评论 -
类似杨辉三角问题——第n杯水
问题:有一座金字塔,从上到下,第一层有一个杯子、第二层有两个杯子,依次类推。对杯子进行编号,有如下的形状: 1 2 34 5 6每个杯子的容量为C升,从塔顶倒下L升水,当1号杯子满了之后,会等量溢出到2号和3号杯子。当2号和3号满了,2号溢出到4号和5号,3号溢出到5号和6号,注意5号接受来自两个杯子的水。依次类推。给定C和L,请问,第n杯里有多少水。fro原创 2013-07-31 02:09:35 · 1617 阅读 · 0 评论 -
二叉树的非递归遍历
在实际应用中,二叉树的遍历一般都采用递归形式,简洁、直观。但在笔试、面试中却很喜欢考察非递归形式的写法,下面将二叉树的非递归遍历实现总结如下:节点定义:struct Node{ int val; Node *left, *right;};1)中序遍历实现Ivoid InOrderTraverse(Node *root){ stack st; st.原创 2013-09-20 16:35:29 · 646 阅读 · 0 评论