摘要:
计数排序时我们使用一个数组来记录出现的数字的次数,而当数据范围太大时,无法建立一个那么大地数组(而且可能空间利用率很低,太浪费),此时可以改用hash table 、 binary search tree等数据结构作为lookup table#include#include#include usin... 阅读全文
摘要:
I假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。II假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格。设计一个算法来找到最大的利润。你可以完成尽可能多的交易(多次买卖股票)。然而,你不能同时参... 阅读全文
摘要:
範例:人潮最多的時段( Interval Partitioning Problem )一群訪客參加宴會,我們詢問到每一位訪客的進場時刻與出場時刻,請問宴會現場擠進最多人的時段。換個角度想,想像會場門口裝著一支監視器。有訪客進入,會場就多一人;有訪客離開,會場就少一人。如此就很容易統計會場人數。遞增的... 阅读全文
摘要:
一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下,再从右下走到左上。第1遍时只能向下和向右走,第2遍时只能向上和向左走。两次如果经过同一个格子,则该格子的奖励只计算一次,求能够获得的最大价值。例如:3 * 3的方格。1 3 32 1 32 2 1能够获得的最大价... 阅读全文
摘要:
分析:这个和我们之前讲的0-1背包问题很像。思路1:我们显然可以把每种物品的每一件都作为一个新的物品按照普通0-1背包的方法做。但是0-1背包的时间复杂度是O(W * N) , 这里N = C1 + C2 + …+ Cn。思路2:换个角度我们用dp[i][j]表示前i件物品,总重量为j的时候的最大价... 阅读全文
摘要:
分析:(1)笨方法,我们可以用普通最大子段和的方法解决这个问题。我们从每个位置“断开”环,然后按普通的最大子段和的方法去做。这样做的复杂度是O(n^2)。(2)巧妙点的方法,我们之所以要从某个位置切开是因为循环的最大子段和可能是跨越一部分头和尾。如上图,最优解可能是0..i, j + 1.. n –... 阅读全文
摘要:
令h(0)=1,h(1)=1,卡塔兰数数满足递归式:h(n)= h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2),这是n阶递推关系;还可以化简为1阶递推关系: 如h(n)=(4n-2)/(n+1)*h(n-1)(n>1) h(0)=1该递推关... 阅读全文
摘要:
表达式计算规则:将表达式的运算符,运算数不加区分放入同一个栈中,从头开始扫描整个表达式,如果遇到运算符栈放入栈中,而如果遇到 阅读全文
摘要:
分析我们已经解决了一维的问题(基础篇中的最大子段和问题),现在变成二维了,我们看看能不能把这个问题转化为一维的问题。最后子矩阵一定是在某两行之间的。假设我们认为子矩阵在第i行和第j列之间,我们如何得到i和j呢,对,枚举。 枚举所有1 2 int max(int a,int b){ 3 if ... 阅读全文
摘要:
将一堆正整数分为2组,要求2组的和相差最小。例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。 整数个数n= 0)第i个数放入哪个组有两种可能:(1) 第i个数放入原来和比较大的组,那么放入第i个数的时候差值变成了j,拉大了差值,所以原来的差值是j... 阅读全文