数据结构算法
YourGodFather
关注C/C、Java、Python、PHP、linux编程、Javascript、jquery、Linux内核、Hadoop、Hbase、NoSql、移动互联开发等
展开
-
算法之旅(一):最大子序列和
给定整数序列 [A1、A2、... An](可能有 Ai 例如: -2,11,-4,13,-5,-2的最大子序列和为20(子序列[11、-4,13])。 本文论述了四种方法来求解该问题,这四种方法的时间复杂度分别为O(N^3)、O(N^2)、O(N(logN))、O(N)。 在描述算法的过程中,我们将输入保存在数组A[N]中,算法以数组地原创 2012-08-31 22:42:54 · 493 阅读 · 0 评论 -
求解n个元素的m元素子集(部分元素组合)
前几天面试百度的一道算法题,大概是说一个密码由三个不同字符组成,其密码字符由"0-9"以及"a-z"的字符集组成,要求找出所有可能的密码。 这道题比较简单,是常见的排列组合问题,由于之前的博客文章已经讨论的排列问题(集合的全排列),在此我们仅仅讨论一下组合的问题,n个元素集合中求m个元素的子集合: 我们在这里介绍的是递归的方法,思路如下: 问题可分解为: 1. 首先从n个数中选取编号最大的原创 2012-10-23 00:15:58 · 1877 阅读 · 0 评论 -
算法之旅(四):硬币找零问题
硬币找零问题一个经典问题,也是阐述动态规划法几乎必讲的一个例子。 硬币找零问题描述:现存在一堆面值为 V1、V2、V3 … 个单位的硬币, 各单位的硬币数目不限, 问最少需要多少个硬币才能找出总值为 T 个单位的零钱? 比如: 假设这一堆面值分别为 1、2、5、21、25 元,需要找出总值 T 为 63 元的零钱。 基于动态规划的思想,我们可以从目标值为 1 元开始计算出最少需要几个硬币,原创 2012-09-30 22:56:36 · 1446 阅读 · 0 评论 -
给定一个英语词典,求出所有的变位词(兄弟单词)集合
《编程珠玑》第一册第二章的开头提出的一个问题 所谓变位词就是组成单词的字母完全一样,仅仅是字母的顺序不同,这些单词称为变位词,又叫兄弟单词。如pots、stop及tops互为变位词 书中提到的方法思路为: 注:上述图片引用了博客http://www.cnblogs.com/biyeymyhjob/archive/2012/08/14/2636962.html中的图片 根据该思想,使用C原创 2012-10-13 19:00:27 · 1288 阅读 · 0 评论 -
位运算的应用
1、求两整数的平均数 如果直接使用(x+y)/2,则容易发生溢出,使用下面的位运算则可以避免这种情况: int average(int x, int y) { return (x&y + (x^y)>>1); } 或者定义为宏: #define AVERAGE(x, y) (((x)&(y) + ((x)^(y))>>1)) 分析: 从二进制相加的角度来观察,我们可以将x和y都原创 2012-09-22 21:36:00 · 306 阅读 · 0 评论 -
由1-7的随机整数函数构造1-10随机整数函数
题目: 已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。 分析:要保证rand10()在整数1-10的均匀分布,可以构造一个1-10*n的均匀分布的随机整数区间(n为任何正整数)。假设x是这个1-10*n区间上的一个随机整数,那么x%10+1就是均匀分布在1-10区间上的整数。由于(rand7()-1)*7+rand7转载 2012-10-11 17:54:07 · 440 阅读 · 0 评论 -
不用循环、三元操作符、判断及分支结构用用printf输出1-1000间的所有数
今天在某公司面试遇到的题目 当时想了一会,应该是用递归做,关键在于递归怎么结束.。 于是写下了如下的代码,代码比较丑陋,求甚解 void Print_Go(int cur, int end); void Print_Stop(int cur, int end); typedef void (*pFunc)(int, int); pFunc Funcs[] = {Print_Go, Prin原创 2012-10-10 23:08:12 · 417 阅读 · 0 评论 -
算法之旅(二):输入一个正数n,输出所有和为n 连续正数序列
题目:输入一个正数n,输出所有和为n 连续正数序列。 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。 分析:这是网易的一道面试题。 这道题和本微软面试100 题系列V0.1 版的第14 题有些类似。我们可用两个数small 和big 分别表示序列的最小值和最大值。首先把small 初始化为1,big 初始化为2。如果从small原创 2012-09-12 14:20:37 · 1422 阅读 · 0 评论 -
算法之旅(三):求一个数组的最长递减子序列
创新工场面试题: 求一个数组的最长递减子序列,例如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2} 思路:这是很经典的一个问题,用动态规划解决。设源数组为A,我们定义一个长度与A相同的辅助数组为B,B[i]表示以A[i]结尾的最长递减序列的长度。举个简单的例子,如果A[i]大于之前的所有元素,那么以A[i]为结尾的最长递减序列只能为A[i]本身,则B[i] =原创 2012-09-12 21:58:51 · 1334 阅读 · 0 评论 -
求集合的全排列
设R={r1,r2,...,rn}是要进行排列的n个元素,Ri = R-{ri}.集合 X 中元素的全排列记为Perm(X)。(ri)Perm(X)表示在全排列Perm(X)的每一个排列上加前缀ri得到的排列。R的全排列可归纳定义如下: 1)、当 n = 1时, Perm(R) = (r),其中r是集合R中唯一的元素; 2)、当 n >1时, Perm(R)由(r1)Perm(R1),(r原创 2012-10-05 17:57:20 · 741 阅读 · 0 评论