我试图解决以下问题:COINCHANGE:动态编程O(N)复杂
您将得到一套硬币S的在你有多少种方法可以使之ň假设你有各自的无限量在集合中的硬币。
注意:集合S中的硬币将是唯一的。预计这个问题的空间复杂度是O(N)。 请注意,答案可能会溢出。所以,给我们答案%1000007
我使用DP
HashMap<Integer, HashMap<Integer, Integer>> memo = new HashMap<>();
public int coinchange2(List<Integer> a, int b) {
return use(a, 0, b);
}
private int use(List<Integer> a, Integer index, int n) {
if(memo.containsKey(a.get(index))) {
if(memo.get(a.get(index)).containsKey(n)) {
return memo.get(a.get(index)).get(n);
}
}
if(n == 0 && a.get(index)>=0) {
return 1;
}
if((n > 0 && a.get(index) == 0) || n < 0) {
return 0;
}
int nbWays = 0;
for(int i = index; i < a.size(); i++) {
nbWays += use(a, i, n - a.get(i))%1000007;
}
if(!memo.containsKey(a.get(index))) {
memo.put(a.get(index), new HashMap<Integer, Integer>());
}
nbWays = nbWays % 1000007;
memo.get(a.get(index)).put(n, nbWays);
return nbWays;
}
但我仍然不符合要求以下解决方案:“部分正确的答案让你的解决方案更有效的”
你知道什么可能导致此代码不是O(N)的复杂性吗?
我想你是对的使用指示O(n^2)的复杂性,谢谢! –
你把我放在了好的轨道上,我会重写这个版本,并添加一个带有O(N)复杂度的Java版本的响应。 –
听起来不错!我很高兴看到你如何解决它! –