编程之美
文章平均质量分 69
娃哈哈纯净李
这个作者很懒,什么都没留下…
展开
-
子数组之和的最大值(二维)
《编程之美》第2.15节:子数组之和的最大值(二维)题目:求二维数组中子数组的最大和解法:从上到下遍历,对于第i行,遍历从第i行往下的所有行,使其加和成为一维数组,然后用一维数组求最大值来做。代码:#include#includeusing namespace std;int sub2DarrySum(int A[][5],int N,int M)//返回要排除的值{/原创 2015-01-05 22:08:38 · 519 阅读 · 0 评论 -
数字哑谜和回文
《编程之美》第4.10节:数字哑谜和回文题目:人过大佛寺*我=寺佛大过人解法:枚举代码:python写的a=[2,3,4,5]for i in range(10000): ge=i%10 shi=i%100//10 bai=i%1000//100 qian=i//1000 if ge==shi: continue i原创 2015-01-14 20:35:46 · 562 阅读 · 0 评论 -
最大公约数问题
《编程之美》第2.7节:最大公约数问题方法一:辗转相除法。方法二:不断相减法:为了避免进行求余运算。方法三:不断提出公约数2,如果没有公约数2,则两个数中偶数/2变成奇数,如果二者都为奇数,则进行方法2的运算。#includeusing namespace std;int gcd1(int x,int y){ if(x<y) return gcd1(y,x); wh原创 2014-12-09 18:52:25 · 500 阅读 · 0 评论 -
1的数目
《编程之美》第2.4节:1的数目题目:给定一个十进制整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有"1"的个数。方法一:暴力枚举,肯定能够算出来,但是这样的复杂度为O(NlgN)。方法二:寻找规律,用公式计算,复杂度为O(lgN)。当某一位的数为0时,这个位上出现1的总次数就等于其高位数字乘以其所在位的权重,加入21023,百位为0,则其出现1的个数为21*100,原创 2014-12-06 16:37:11 · 494 阅读 · 0 评论 -
分层遍历二叉树
《编程之美》第3.10节:分层遍历二叉树问题:把二叉树进行层次遍历,或者可以选择遍历第几层解法:用队列来做,进行先进先出代码:#include#includeusing namespace std;struct Node{ Node *left; Node *right; char value; Node(char v,Node *l=nullptr,Node *原创 2015-01-11 22:32:27 · 486 阅读 · 0 评论 -
重建二叉树
《编程之美》第3.9节:重建二叉树问题:已知二叉树的先序和中序遍历,重构二叉树解法:通过先序遍历,不断抽取子树的根节点进行重构。代码:#includeusing namespace std;struct Node{ Node *left; Node *right; char value; Node(char v,Node *l=nullptr,Node *r=nul原创 2015-01-11 21:44:11 · 376 阅读 · 0 评论 -
求二叉树中节点的最大距离
《编程之美》第3.8节:求二叉树中的最大距离问题:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们定义距离为两个节点之间的边数,求一棵二叉树中县局最远的两个节点之间的距离。解法:树的后序遍历,然后再每个节点中维护两个变量nMaxLeft,nMaxRight保存当前节点为根节点的子树中的最远距离,不断更新maxLength,直到根节点。代码:#includeusin原创 2015-01-11 21:04:01 · 530 阅读 · 0 评论 -
队列中取最大值操作问题
《编程之美》第3.7节:队列中取最大值操作问题问题:如何能够以最低的时间复杂度来取队列中的最大值?解法:用两个能够在线性时间取最大值的栈来构造队列,从而能够在O(1)的时间复杂度内取得最大值。代码如下:#include#includeusing namespace std;class Stack{ stack s; stack maxValue;public: v原创 2015-01-11 20:23:46 · 636 阅读 · 0 评论 -
最短摘要的生成
《编程之美》第3.5节:最短摘要的生成题目:假设给定的已经是经过网页分词之后的结果,词语序列数组为T。假设用户输入的搜索关键词为数组S。这样生成的最短摘要实际上就是一串相互联系的分词序列。解法:遍历一遍输入序列T,将T中与S字符相同的字符的下标放入数组中,然后从这个数组中不断读出单词,放入集合ses中,当ses的大小等于S.size()时,说明已经找到一个短的摘要了,更新length。如果原创 2015-01-10 21:24:19 · 569 阅读 · 0 评论 -
点在多边形内算法——判断一个点是否在一个复杂多边形的内部
转自:http://blog.csdn.net/hjh2005/article/details/9246967新页面(new page)介绍了将样条曲线添加到此技术的内容。也可以访问多边形内最短路径页(shortest-path-through-polygonpage)!图 1图1显示了一个具有14条边的凹多边形。我们要判断红色点是否在多边形内。解决转载 2015-01-13 19:15:57 · 976 阅读 · 0 评论 -
判断一个点是否在一个四面体内
转自:http://tieba.baidu.com/p/787142172用同一种绕序(顺时针或逆时针)把四面体的四个面顶点顺次写出 然后求出每个面的法向量(通过每个面同样顺序的两条边向量做叉积得到 为了让法向量全部朝里或朝外一定要用同一种绕序) 再求出法向量和 目标点到面上任意一点的向量 的点积 如果四个点积同号那就在里面(如果你不能理解里面的名词就百科一下 如果完全不能理解的话建议你仔转载 2015-01-13 19:17:50 · 5509 阅读 · 0 评论 -
求数组中的子数组之和的最大值
《编程之美》第2.14节:求数组中的子数组之和的最大值题目:有一个有N个元素组成的一维数组,这个数组中当然有很多子数组,那么子数组之和的最大值是多少?解法:从头到尾遍历整个数组,不断加和,如果临时和temp代码如下:#include#includeusing namespace std;int subarrySum(int *A,int N)//返回要排除的值{ int原创 2015-01-05 21:00:10 · 1908 阅读 · 0 评论 -
二维数组如何作为函数参数使用?
转自:http://blog.csdn.net/xinshen1860/article/details/20620227如果我们需要编写一个处理二维数组的函数,那么这个函数原型应该如何声明呢?首先,我们应该牢记:数组名被视为其地址,因此,相应的形参是一个指针。例如,假设有如下的代码:[cpp] view plaincopy转载 2015-01-05 22:17:22 · 1410 阅读 · 0 评论 -
子数组的最大乘积
《编程之美》第2.13节:子数组的最大乘积题目:给定一个长度为N的整数数组,值允许用乘法,不能用除法,计算任意N-1个数的组合中乘积最大的一组,并写出算法的时间复杂度。解法:遍历一遍数组,找出数组中正数的个数posNum,负数的个数negNum和0的个数zerosNum,如果zerosNum>1则结果必然是1,否则,如果负数的个数为奇数,就去掉一个最大的(绝对值最小的)负数。如果zeros原创 2015-01-05 20:49:56 · 572 阅读 · 0 评论 -
快速寻找满足条件的两个数
《编程之美》第2.12节:快速寻找满足条件的两个数题目:给定一个数组,找出数组中两个数,使其和为给定的sum。解法:先进行排序,然后左右夹逼。leetcode中的TowSum即是这个题。程序如下:#include#includeusing namespace std;pair twoSum(int *A,int N,int sum){ sort(A,A+N); for原创 2015-01-05 20:15:56 · 521 阅读 · 0 评论 -
寻找平面中距离最远的点
转自:http://blog.csdn.net/hackbuteer1/article/details/7484746问题给定平面上N个点的坐标,找出距离最远的两个点。分析类似于“最近点对问题”,这个问题也可以用枚举的方法求解,时间复杂度O(n^2)。“寻找最近点对”是用到分治策略降低复杂度,而“寻找最远点对”可利用几何性质。注意到:对于平面上有n个点,这一对最远点必然存在于这转载 2014-12-12 19:26:40 · 5838 阅读 · 0 评论 -
《编程之美》蚂蚁爬杆问题的扩展
转载:http://lam8da.sinaapp.com/?p=11《编程之美》4.7节描述了蚂蚁爬杆问题,把所有具体数字都表示成字母后变为形如如下形式的问题:有一根长为L的平行于x轴的细木杆,其左端点的x坐标为0(故右端点的x坐标为L)。刚开始时,上面有N只蚂蚁,第i(1≤i≤N)只蚂蚁的横坐标为xi(假设xi已经按照递增顺序排列),方向为di(0表示向左,1表示向右),每个转载 2015-01-13 21:57:33 · 1002 阅读 · 0 评论 -
挖地雷游戏的概率
《编程之美》4.11:挖地雷游戏的概率转自:http://blog.sina.com.cn/s/blog_71145bba0100mdmh.html在16*16的地雷阵中,有40个地雷,点击了2下后,出现如下的局面(图1):分析图中的局部(图2),问题1:当游戏中有40个雷没有被发现的时候,A、B、C三个地方有雷的概率P(A), P(B), p(C)转载 2015-01-14 22:18:50 · 1315 阅读 · 0 评论 -
寻找最大的K个数
《编程之美》2.5:寻找最大的K个数下面的程序写的是寻找的最小的K个数,最大的K个数类似:#include#include#includeusing namespace std;int quickSelect(int A[],int N){ swap(A[0],A[rand()%N]); int k=1; for(int i=1;i<N;i++) { if(A[i]原创 2014-12-09 16:36:28 · 502 阅读 · 0 评论 -
从无头链表中删除节点
《编程之美》第3.4节:从无头链表中删除节点问题:假设有一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(不是第一个也不是最后一个节点)请将该节点从单链表中删除解法:题目中已经说明既不是头节点也不是尾节点,因此不用考虑特殊情况。要解这个题首先的思路是寻找前一个节点的指针,但是由于这是一个单链表,前一节点的next指针无论如何是不可能得到的,因此肯定不能这么算。只能有一个办法了,就原创 2015-01-10 19:48:57 · 1729 阅读 · 0 评论 -
寻找发帖水王
《编程之美》第2.3节:寻找发帖水王题目一:给定一个数组,共有N个数,其中有一个数出现了超过N/2次,用O(N)的时间找出这个数。解法:不断从数组中删除2个不同的数,这个时候,要求的数仍然占据总数的1/2以上。题目二:给定一个数组,共有N个数,其中有3个数出现了超过1/4次,用O(N)的时间找出这3个数。解法:同上,不断从数组中删除4个不同的数即可。#includeusing原创 2014-12-04 17:44:16 · 471 阅读 · 0 评论 -
不要被阶乘吓倒
《编程之美》第2.2节:不要被阶乘吓倒问题一:给定一个整数N,那么N的阶乘N!末尾有多少个0?方法一:遍历1-N所有数,求出N!的因式分解时5的个数即可。方法二:求5的个数时,有N/5+N/5^2+N/5^3+……,表示N能够分解成几个5这个因子,因为N/k表时N中有几个数能够被k整除,这样N/5表示N中能被5整除的数,然后N/25表示N中能被25整除的数,此时本应该加两次,但是前面能原创 2014-12-04 16:48:06 · 554 阅读 · 0 评论 -
24点游戏
《编程之美》1.16 24点游戏输入:n1,n2,n3,n4。输出:若能得到运算结果为24,则输出一个对应的运算表达式,否则输出0。例如:输入11,8,3,5,则输出为:(11-8)*(3+5)=24。思想:四个数总共有五种结合方式,即A(B(CD))、A((BC)D)、(AB)(CD)、(A(BC))D、((AB)C)D,而我把这五种次序存入保存计算顺序的二维数组sequence中,每次原创 2014-11-29 11:05:35 · 724 阅读 · 0 评论 -
小飞的电梯调度算法
《编程之美》原创 2014-11-21 22:06:37 · 542 阅读 · 0 评论 -
NIM(3)两堆石头的游戏
《编程之美》1.13节:NIM(3)两堆石头的游戏题目:假设有两堆石头,有两个玩家会根据如下的规则轮流去石头:没人每次可以从两堆石头中各取出数量相等的石头,或者仅从一对石头中取出任意数量的石头;最后把剩下的石头一次拿光的人获胜。解:把两堆石头的数目用列表列出,找出其中的不安全点,而能够一步到达这种不安全点的地方都是安全点。进而根据不安全点找出规律。规律:一般而言,第n组的不安全局面(an,原创 2014-11-26 21:17:10 · 1003 阅读 · 0 评论 -
求逆序数(光影切割问题)
《编程之美》第1.7原创 2014-11-21 09:43:30 · 623 阅读 · 0 评论 -
NIM(1)一排石头的游戏
《》原创 2014-11-25 11:30:11 · 858 阅读 · 0 评论 -
饮料供货
就 Volume,int N,int V[],int C[],int H原创 2014-11-19 22:01:19 · 493 阅读 · 0 评论 -
快速找出故障机器
编程珠玑》原创 2014-11-18 22:14:39 · 388 阅读 · 0 评论 -
一摞烙饼的排序
《编程之美》1.3节:主要是原创 2014-11-18 21:40:55 · 520 阅读 · 0 评论 -
NIM(2)"拈"游戏分析
《编程之美》第1.12节:NIM(2)"拈"游戏分析如果石头总数N是偶数,则后动手的人能赢;如果石头数时奇数,则先动手的人赢,先动手的人只要保证每次取完石头以后,每堆石头的总数异或后得1即可。下面程序给出当N是奇数时,应该如何选取,函数返回值pair中first表示取第i堆,i从0开始,second表示把第i堆变成的数,即剩下的数时divided[i]-second。#include原创 2014-11-25 22:14:14 · 684 阅读 · 0 评论 -
高效的安排见面会
《编程之美》第1.9节原创 2014-11-24 21:48:59 · 478 阅读 · 0 评论 -
电话号码对应英语单词
《编程之美》第3.2节:电话号码对应英语单词题目:给定一个电话号码,输出可能的所有英语单词解法:穷举所有可能的情况,并输出代码:#include#include#include#includeusing namespace std;void printResult1(map&telephone,string &num,string result,int index){原创 2015-01-08 21:18:17 · 508 阅读 · 0 评论 -
数组分割
《编程之美》第2.18节:数组分割问题:有一个无序,元素个数为2N的正整数数组,要求:如何能把这个数组分割为元素个数为N的两个数组,并使者两个子数组的和最接近?解法:动态规划,开辟一个N*Sum/2的数组,isOK[i][v]表示是否可以找到i个数,使得它们的和是v。然后对于每一个在数组中的数,不断的更新这个数组,最后在isOK[N][j]中找出一个最大的值就是所求了。代码:#in原创 2015-01-07 20:12:11 · 666 阅读 · 0 评论 -
计算字符串的相似度
《编程之美》3.3节:计算字符串的相似度问题:对于给定的两个字符串,用最少的操作:插入、删除和替换,使得两个字符串相同。找出这个最少需要操作的步数。解法:1)一步操作后,再将A[2:end]和B[2:end]编程相同的字符串 2)一步操作后,再将A[1:end]和B[2:end]编程相同的字符串 3)一步操作后,再将A[2:end]和B[1:end]编程相同的字符串原创 2015-01-08 21:42:43 · 569 阅读 · 0 评论 -
字符串移位包含的问题
《编程之美》第3.1节:字符串移位包含的问题问题:给定两个字符串s1和s2,要求判定s2是否能够被s1做循环移位(rotate)得到的字符串包含。解法:将s1字符串进行扩展后包含其移位后的所有字符串,然后进行比较即可。代码:#include#include#includeusing namespace std;int main(){ string s1="AABBCD原创 2015-01-08 19:25:45 · 509 阅读 · 0 评论 -
区间重合判断
《编程之美》第2.19节:区间重合判断问题:给定一个源区间[x,y](y>=x)和N个无序的目标区间[x1,y1]…[xn,yn],判断源区间[x,y]是不是在目标区间内?解法:将目标区间排序,然后合并重合区间,最后用二分法查看源区间是否在目标区间内。代码:#include#include#includeusing namespace std;struct Node{原创 2015-01-07 21:16:45 · 737 阅读 · 0 评论 -
程序理解和时间分析
转自:http://www.cnblogs.com/yanglf/archive/2012/11/07/2758700.html《编程之美》第2.20节:程序理解和时间分析程序理解和时间分析123456789101112131415转载 2015-01-07 21:58:48 · 446 阅读 · 0 评论 -
求数组中最长递增子序列
《编程之美》第2.16节:求数组中最长递增子序列问题:写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度。解法:可以暴力求解,复杂度为O(N^2),另外可以开辟一个数组maxV,其中maxV[i]存放长度为i的递增子序列最大的元素的最小值,用二分法搜索maxV元素,从而使复杂度能够降到O(NlogN)。代码:#include#includeusin原创 2015-01-06 20:52:24 · 725 阅读 · 0 评论 -
数组循环移位
《编程之美》第2.17节:数组循环移位题目:设计一个算法,把一个含有N个元素的的数组循环右移k位,要求时间复杂度为O(N),且值允许使用两个附加变量。解法:三次反转即可。代码:#include#include#includeusing namespace std;void rightShift(string s,int k){ if(k>=0) { k=k%原创 2015-01-06 21:06:34 · 441 阅读 · 0 评论