摘要:
整数的任意拆分问题(不允许重复)问题:输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数(不许重复), 使其和等于m (m<=1+2+...n),要求将其中所有的可能组合列出来.分析:记整数p可以用1,2...q的所有不重复数之和表示的组合为C(p,q),则C(p,q)可以表示为以下的组合:{q} + C(p-q,q-1) (如果q<=m)或者C(p,q-1)即要么包含q,要么不包含q。另外有C(0,K)={}, C(K,0)无解(K>0)因此可以使用动态规划的方法解决。实现:import java.util.ArrayList;import java.u 阅读全文
摘要:
中位数(median)是一个排好序的元素中中间位置的元素,如果元素个数为偶数,则是中间两个元素的平均值。例如(3,1,5)的中位数是3,而(2,1,3,5)的中位数是2.5。查找中位数属于Selection Algorithms的一种。用快速排序可以做到每次divide之后,只需要conquer一个分支,时间复杂度为O(nlogn)。为便于比较,以下代码包含quicksort的算法实现: public static float findMedianByQuicksort(int[] A,int left,int right){ //if(right<left) // throw new 阅读全文
摘要:
输入一序列的整数(共n个),找出前十个元素(Top 10)。可以用Heap实现:在堆满时,如果要插入一个新的元素,则需比较该元素是不是当前堆中最小的元素,如果不是,则需要将该新元素替换最小的元素,从而维护一个TOP N的堆。通常最小的元素查找需要线性时间,因为只需要查找叶子节点(这是由堆的ordering property决定的),而叶子节点个数最多为2^O([logn] ) = O(n),所以查找最小元的总开销为O(n),然后需要重新构建堆,其总开销为O(nlogn), 二者加起来总的时间复杂度为O(nlogn), 空间开销为O(1)。显然比通过排序查找Top N的空间复杂度要低得多!实现: 阅读全文
摘要:
static int inversePairs(int[] A,int left,int right){ if(right<left) return 0 ; int mid = (left + right)/2; int inverseCnt = 0; if(mid>left){ inverseCnt += inversePairs(A,left,mid); } if(mid+1<right){ inverseCnt += inversePairs(A,mid+1,right); } //merge the two parts int i1=left; int i2=mid+ 阅读全文
摘要:
//输入p: 访问概率数组; 0,1,....n是排好序的Key值 //输出A=new float[n][n]: 最优时间矩阵 //输出R=new int[n][n]: 根结点矩阵 static void optimalBST(float[] p,float[][] A,int[][] R){ int n = p.length; for(int i=0;i<n;i++){ A[i][i] = p[i]; R[i][i] = i; //the root is itself } for(int diag=1;diag<n;diag++){ for(int i=0;i<n;i++) 阅读全文
摘要:
问题: 输入N个不同字符,如'a','b','c','d','e', 计算从这个字符集合中任意抽取n个(n<=N)不同字符的所有组合结果,比如从中抽取4个字符的组合结果为abcd, abce,abde,acde,bcde共5个。分析:从字符全排列的算法(参见上一篇"字符集的排列算法")中可以知道,组合操作只是选取一部分字符作排列,同时需要把重复的情况剔除,如abc和cba是两个不同排列,但是只算一个组合,去掉重复的情况可以按次序选取元素,即下一个位置(pos)的字符需要大于上一个位置的字符 阅读全文
摘要:
问题:输入一串字符,每个字符都是唯一的,比如'a','b','c','d', 需要输出这串字符的全部排列。分析:根据排列原理,排列的可能性有n!种(n为字符的个数)。直觉上讲,首先从字符集合中选取一个字符,然后从剩下的字符中选取另外一个字符,如此下去,直到所有字符用完为止。另外一种可能性是:先假设一个子串已经排列好,比如abc,然后将下一个字符串d插入到已经排好的字符串的两边和中间位置(这里共有4个位置)。下面实现的是第一种算法:实现://chars: 输入的字符串//used: 用于标记已经用过的字符//pos: 当前处理的字符 阅读全文