上一页 1 2 3 4 5 6 7 8 ··· 13 下一页
摘要: 1. 简述 设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。2. 思路 其实看到题目中只允许两个附加变量应该也能想到,就是两个变量倒来倒去就行了。如果熟悉希尔排序的话,这题不是问题,希尔排序里面需要分组进行插入法排序,这里就是分组进行移位而已。 举例先说明下,假设10个元素,要移动3位,那么就是三组,第一组:A[0],A[3],A[6],A[9],第二组:A[1],A[4],A[7],第三组A[2],A[5],A[8],每组分别内部移位即可。 不过有一个问题必须注意,假设移动k为,数组长度为N,当k<=N/2时,没问题,但是当k&g 阅读全文
posted @ 2011-10-08 10:31 xiaodongrush 阅读(666) 评论(2) 推荐(0) 编辑
摘要: 1. 简述 写一个时间复杂度尽可能低的程序,求一个一维数组中最长递增子序列的长度。 例如在序列1,-1,2,-3,4,-5,6,-7中,其最长的递增子序列的长度为4(如1,2,4,6)。2. 思路 这个题目与前面求一维数组中子数组之和最大值有点像,不过区别还是很明显,比如:子数组是数组中一串连续相邻的数字,而子序列不一定是相邻的,因此要得到[0-k]的子数组最大和,只要分析[0-(k-1)]的子数组最大和即可,而考虑[0-k]的子序列的最长长度,就不能只分析[0-(k-1)]中子序列的最长长度。另外一个区别就是,子数组的和可以扩展到二维数组的情况,但是递增子序列就不好扩展了,最多也就扩展成杨氏 阅读全文
posted @ 2011-10-08 09:42 xiaodongrush 阅读(9199) 评论(2) 推荐(1) 编辑
摘要: 这个也写过,见最大子矩阵和。 阅读全文
posted @ 2011-10-02 10:19 xiaodongrush 阅读(482) 评论(0) 推荐(0) 编辑
摘要: 这个以前写过,见求数组的最长子数组之和的最大值这里说一下后面扩展题目。1. 简述 1) 如果数组首尾相连,即允许找到一组数字(A[i],···,A[n-1], A[0],···, A[j]),请使其和最大,怎么办? 2) 如果题目要求返回最大子数组的位置,算法应该如何改变?还能保持O(N)的复杂度么?2. 思路 第一个问题,书上给出了解答,即分为首尾相连和首尾不连两种情况,对于首尾不连的情况,按照前面的思路就可以了,对于首尾相连的情况,那么必然包含A[N-1]与A[0],然后从A[0]向后找最大的一段(按照不连的方法),从A[N-1] 阅读全文
posted @ 2011-10-02 10:17 xiaodongrush 阅读(716) 评论(1) 推荐(0) 编辑
摘要: 1. 简述 给定一个长度为N的整数数组,只允许用乘法,不能够用除法,计算任意(N-1)个数的组合中乘积最大的一组,并写出算法时间复杂度。2. 思路 题目中要求不能用除法,实际上就是否定了将所有数乘起来,然后分别去除每个数字的方法,实际上这种方法也不好实现,因为如果数字中有0的话,都乘起来就是0,还要除0,麻烦啊,另外,数值溢出也是个麻烦。实际上只要找到N-1个数的组合即可,并不需要去计算这N-1个数字的乘积。 方法就是首先,统计正数,负数,0的个数,以及最大正数的下标,最小正数的下标,最大负数的下标,最小负数的下标,任意一个0的下标。然后分情况讨论:· 如果0的个数大于1,那么N-1 阅读全文
posted @ 2011-10-02 10:14 xiaodongrush 阅读(691) 评论(0) 推荐(0) 编辑
摘要: 1. 简述 能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。2. 思路 方法一:遍历数组中任意两个数字,C(N,2)种组合,复杂度O(N^2)。 方法二:首先排序数组,然后遍历其中每个数字,二分查找找另一个符合条件的数字(即给定值减去遍历的当前数字),复杂度O(LogN + N*LogN),注意这个二分查找要忽略当前遍历的那个数字,注意修改二分查找的代码。另外计数排序或者哈希表也不错,这就不用排序了,复杂度可以到达O(N),另外需要空间复杂度至少为O(N)。 方法三:首先排序数组,假设先序排序,然后两边走,如果刚 阅读全文
posted @ 2011-10-02 09:54 xiaodongrush 阅读(1324) 评论(1) 推荐(0) 编辑
摘要: 1. 简述 给定平面上N个点的坐标,找出距离最近的两个点。2. 思路 暴力的方法是C(N,2),N^2的复杂度。 二分的方法,比如首先将所有的点根据横坐标排序,递归二分。终止条件:直到只有一个点或者两个点的时候返回,一个点时返回空,两个点时返回这两个点构组对。递归过程:先计算左边N/2个点之间的最近点对,计算右边N/2个点之间的最近点对,然后计算左边点与右边点构成的最近点对。这样复杂度公式:T(n) = 2T(n/2) + n^2/4,根据主定理,得到T(n)=n^2/4,还是N^2级别的。 二分的方法进一步化简,复杂度都浪费在(左边的某个点,右边的某个点)这的组合上了。假设MinDistLe 阅读全文
posted @ 2011-09-30 18:09 xiaodongrush 阅读(2389) 评论(2) 推荐(0) 编辑
摘要: 1. 简述 对于一个由N个正数组成的数组,需要比较多少次才能把最大值和最小值找出来?2. 思路 1) 就是遍历一遍,分别统计最大值和最小值,2*N。 2) 每次遍历两个数字,比较一下这两个数字,大的数字更新最大值,小的数字更新最小值,一共是N/2次,每次比较3次,一共就是3*N/2次比较。 扩展问题就是求N个元素的数组中第二大的数,需要比较的次数,以及是否可以是使用类似的分治思想降低比较次数。感觉有点像Top-2,每次先与次大的比,如果大于次大的,更新次大的,然后与最大的比,如果大于最大的,更新最大的。次数可以这样算,每个数大于最大的,小于次大的,以及介于两者之间的可能性假设相同,那么次数的期 阅读全文
posted @ 2011-09-30 14:27 xiaodongrush 阅读(654) 评论(0) 推荐(0) 编辑
摘要: 1. 简述 斐波那契数列的递归公式为:f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2), n>1。尽可能快的计算f(n)。2. 思路 一个就是公式解,算特征方程的方法,好像是线性代数部分的,有点忘了,这里直接给答案吧:根据递归公式,f(n)=f(n-1)+f(n-2),知道f(n)的特征方程为 x*x = x + 1,根为s1=(1+sqrt(5))/2 和s2=(1-sqrt(5))/2。那么存在A,B使得:f(n)=A*s1^n + B*s2^n,代人f(0)=0,f(1)=1,得到A=sqrt(5)/5,B=-sqrt(5)/5。即f(n)=A*s1 + B*s2。 阅读全文
posted @ 2011-09-30 13:59 xiaodongrush 阅读(1143) 评论(0) 推荐(0) 编辑
摘要: 1. 简述 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。 比如N=99时,M=1 122 334 455 667 789,N * M=111 111 111 111 111 111。2. 思路 实际上两个思路,一个就是给N,遍历M,判断N*M是否满足条件的数值;另一个就是给N,遍历满足条件的数值,判断数值能否被N整除。根据样例数据发现,N=99时,第一个方法的复杂度为:M=1 122 334 455 667 789,第二个方法的复杂度为2^15=32 * 1024。即由0和1组成的数值实际上是十分稀疏的,从这边遍历更快。这一点与编程之美 阅读全文
posted @ 2011-09-30 12:27 xiaodongrush 阅读(1591) 评论(0) 推荐(1) 编辑
上一页 1 2 3 4 5 6 7 8 ··· 13 下一页