算法之美
xuguoli_beyondboy
只要笑一笑,没什么过不了。程序员懂得编程之美,也要懂得生活之美,艺术之美,心理之美。
展开
-
一摞烙饼的排序(搜索树)
前两个星期就看编程之美的一摞烙饼排序问题,刚开始看其代码没看懂什么意思,后来看了人家的博客才知道是怎么回事了,自己写了一遍其代码做各种各样的测试,吓我一跳,一个剪枝操作竟然省了那么多的时间,想起上一道题的将帅问题,顿时让我领悟到这编程之美的书籍,题目不但有意思,其代码真的优雅和美,好了接下来看这个烙饼排序问题。 题目: 星期五的晚上,一帮同事在希格玛大厦附近的“硬盘酒吧”多喝了几杯。程序员多喝了原创 2015-04-11 11:23:01 · 798 阅读 · 0 评论 -
不要被阶乘吓到
编程之美有一道关于阶乘的题目: 1给定一个整数N,那么N的阶乘等于N!,末尾有多少个0呢,例如N=10,N!=3628800,N!的末尾有两个0 2求N!的二进制表示中最低位为1的位置。 阶乘定义: **n!={1n(n−1)!n=0n>0∀n∈Nn! = \left\{ {\begin{array}{*{20}c} 1 \\ {n(n - 1)!} \\\end{ar原创 2015-09-22 00:49:07 · 1453 阅读 · 0 评论 -
构造数独
编程之美有一道关于深度搜索和回溯应用的题目——构造数独: 数独的棋盘是由九九八十一个小方格组成的。玩家在每个小格子中,分别天上1至9的任意一个数字,让整个棋盘每一行,每一列,以及每一个3*3的小矩阵中的数字都不重复。 作者给两种解法: 解法一: 下面的GenerateValidMatrix()函数用经典的深度优先搜索来生成一个可行解。从(0,0)开始,对没有处理过的格子,调用GetValid原创 2015-09-13 14:03:56 · 1638 阅读 · 0 评论 -
求数组中最长递增子序列
编程之美有一道关于数组中最长递增子序列,题目如下: 写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度。 例如在序列1,-1,2,-3,4,-5,6,-7中,其最长的递增子序列的长度为4(如1,2,4,6),从该书给的例子我们可以知道的是其最长的递增子序列可以不连续的。 作者利用动态规划方法给了三种解法。 解法一: 根据无后效原创 2015-09-07 16:43:04 · 3764 阅读 · 1 评论 -
斐波那契数列
编程之美有一道题是关于斐波那契数列,作者提供了三种解决思路: 第一种解法: 根据递推关系定义: 其转换成递归树,该结构如图: 从上面递归树结构可以看出其有重叠情况,故编程之美提出可以用一个存储变量来存储其计算过的值来排除解决重复的计算的问题,其时间复杂度为O(N),空间复杂度也为 O(N)。 第二种解法: 根据线性递推数列定义:具有形如xn+2=axn+1+bxn{{x}_{n+原创 2015-08-20 14:43:32 · 775 阅读 · 0 评论 -
寻找最大的K个数
编程之美有一道考察多种排序的题目,题目如下: 有一个长度为N的无序数组,假定其中的每一个元素都各不相等,求其中最大的K个数。 作者对于此题目结合各种排序算法给出了五种解法思路。 解法一: 使用快速排序或堆排序对它们元素进行排序,整个排序的时间复杂度为O(N*log2{log}_2N),然后取出前K个,时间复杂度为O(K),总时间复杂度O(N*log2{log}_2N)+O(K)=O(N*l原创 2015-09-02 01:57:45 · 1341 阅读 · 0 评论 -
计算字符匹配相似度
编程之美有一道这样的题目,如下: 许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程序。我们定义一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把“a”替换为“b”); 2.增加一个字符(如把“abdd”变为“aebdd”); 3.删除一个字符(如把“travelling”变为“traveling”); 比如,对于“abcde原创 2015-08-17 15:33:35 · 2338 阅读 · 0 评论 -
高效率地安排见面会
编程之美有一道是关于图的最少着色的题目,题目如下: 在校园招聘的季节里,为了能让学生们更好地了解微软亚洲研究院各研究组的情况,HR部门计划为每一个研究组举办一次见面会,让各个研究组的员工能跟学生相互了解和交流(如图1-4所示)。已知有n位学生,他们分别对m个研究组中的若干个感兴趣。为了满足所有学生的要求,HR希望每个学生都能参加自己感兴趣的所有见面会。如果每个见面会的时间为t,那么,如何安排才能够原创 2015-08-29 16:40:23 · 773 阅读 · 1 评论 -
最大公约数问题
编程之美有一道关于求最大公约数的题目,该书的作者提供了三种思路: 第一种解法: 根据辗转相除法,可以得到f(x,y) = f(y , x % y) (x >= y > 0),直到其中一个数为0,这公式可以由以下三条推论得到:推论1、如果a能被b整除(a=qb),若k为正整数,则ka也能被b整除(ka=kqb)。推论2、如果a能被c整除(a=hc),b也能被c整除(b=tc),则(a±b)也能原创 2015-08-26 14:45:38 · 609 阅读 · 0 评论 -
字符串移位包含的问题
编程之美有一道这样的题目:给定两个字符串 s1 和 s2, 要求判定 s2 是否能够被通过 s1 作循环移位 ( rotate )得到的字符串包含. 例如, 给定 s1 = AABCD 和 s2 = CDAA, 返回 true; 给定s1 = ABCD 和 s2 = ACBD, 返回 false. 书的作者该出了两种思路: 第一种解法: 用暴力穷举法,穷举s1(如ABCD)做循坏移位所能得到的原创 2015-08-25 13:25:31 · 604 阅读 · 0 评论 -
寻找数组中的最大值和最小值
编程之美有一道是关于寻找数组中的最大值和最小值的题目,该作者提供了四种思路解法: 第一种思路: 直接暴力遍历寻找数组中的最大值和最小值,该算法比较次数为2*N次。 第二种思路: 首先按顺序将数组中相邻的两个数分在同一组,例如数组为{5,6,8,3,7,9},按其思路分组,其结果如图所示: 接着比较同一组中奇数位数字和偶数位数字,将较大的数放在偶位数上,较小的数放在奇数位上,经过N/2次原创 2015-08-21 21:40:29 · 1850 阅读 · 0 评论 -
求二进制数中1的个数
对于一个字节(8bit)的变量,求其二进制表示中”1”的个数,要求算法的执行效率尽可能的高。 这道题看似简单,但对于这道题作者却给了出五中解法。 解法一:每次求余,看余数是否为1,如果是的话就累计加一,然后再除以2,重复以上步骤,直到为0,最后这个结果就是二进制表示中1的个数。//求余统计二进制数中1的个数int Count(unsigned char v){ int num=0;原创 2015-11-15 21:30:19 · 1576 阅读 · 1 评论