我写了一大堆代码
private int CountChangeOptions(int[] coins, int j, int N)
{
if(j == 0)
return 0;
if(N == 0)
return 1;
if(j == 1)
return N % coins[0] == 0 ? 1 : 0;
int sum = 0;
int k = coins[j - 1];
for(int i = N; i >= 0; i -= k)
{
sum += CountChangeOptions(coins, j - 1, i);
}
return sum;
}
正确评估(虽然不够快)。由于大多数CountChangeOptions(coins, x, y)
的{{1}}将在算法过程中使用相同的coins
多次调用,x
我决定实施缓存策略
y
其中private int CountChangeOptions(int[] coins, int j, int N)
{
if(j == 0)
return 0;
if(N == 0)
return 1;
if(j == 1)
return N % coins[0] == 0 ? 1 : 0;
int sum = 0;
int k = coins[j - 1];
for(int i = N; i >= 0; i -= k)
{
sum += CountOrGetFromCache(coins, j - 1, i);
}
return sum;
}
private int CountOrGetFromCache(int[] coins, int j, int i)
{
if(_cache[j, i] == null)
{
_cache[j, i] = CountChangeOptions(coins, j, i);
}
return (int)_cache[j, i];
}
是之前使用_cache
设置的int?[][]
。但是现在这已经失败了一些测试用例。知道为什么吗?
答案 0 :(得分:0)
我看到的唯一问题是_cache变量未正确初始化为
_cache = new int[N+1, N+1]
而不是
_cache = new int[coins.Length+1, N+1]
除此之外,两种解决方案功能相同。我不相信有一个功能测试用例适用于第一个(慢速)实现,而第二个实现失败。
我猜你正在使用像HackerRank这样的网站,而第一个解决方案可能会超时,让你觉得它有效,第二个更快,不会超时,但会产生不正确的结果。