ジョンスミス :
私は解決しています。この leetcode上の問題を。私の解決策のための時間と空間の複雑さを把握することはできません。
特に、私がどのように適用するかを理解することはできませんマスター定理を、我々はループのために持っているとき場合にはここに。ここで、bは何ですか?入力が複数回分割して部分問題の異なるサイズからです。もう一つの合併症はメモ化です。
class Solution {
private Map<String, List<Integer>> cache = new HashMap<>();
public List<Integer> diffWaysToCompute(String equation) {
if (cache.containsKey(equation)) return cache.get(equation);
if (!(equation.contains("+") || equation.contains("-") || equation.contains("*"))) return Collections.singletonList(Integer.valueOf(equation));
List<Integer> result = new ArrayList<>();
for (int i = 0; i < equation.length();i++) {
char ch = equation.charAt(i);
if (ch == '+' || ch == '-' || ch == '*') {
List<Integer> left = diffWaysToCompute(equation.substring(0, i));
List<Integer> right = diffWaysToCompute(equation.substring(i+1, equation.length()));
result.addAll(crossCalc(left, right, ch));
}
}
cache.put(equation, result);
return result;
}
private List<Integer> crossCalc(List<Integer> left, List<Integer> rigth, char sign) {
List<Integer> result = new ArrayList<>();
for (Integer l : left) {
for (Integer r : rigth) {
if (sign == '-') {
result.add(l - r);
} else if (sign == '+') {
result.add(l + r);
} else {
result.add(l*r);
}
}
}
return result;
}
}
私は、答えだけでなく、時間の複雑さを計算する方法を説明を探しています。好ましくはあなたがとメモ化なしの両方のための複雑さを説明することができれば。ありがとう!
ERFAN Alimohammadi:
あなたのアルゴリズムの時間計算が正しく一致している括弧のn個のペアを含む式の数に等しいです。
これは呼ばれるカタロニア語の数、それはC(2 * N、N)/(N + 1)=(2 * N)に等しいです!/((N + 1)!* n個!)。
また、カタロニア語の数を計算するための再帰式があります:
f(n+1) = f(0)f(n) + f(1)f(n-1) + f(2)f(n-2) + ... + f(n-2)f(2) + f(n-1)f(1) + f(n)f(0)
そして、あなたが知っている、それはあなたのアルゴリズムの時間複雑方程式と同じです!
T(n+1) = T(0)T(n) + T(1)T(n-1) + T(2)T(n-2) + ... + T(n-2)T(2) + T(n-1)T(1) + T(n)T(0)
要素の数ので、このアルゴリズムのメモリの複雑さは、それの時間複雑さと同じ大きさとすることができるresult
のArrayListを大きくすることができます。だから、最悪の場合にはメモリと時間の複雑さは、n番目のカタラン数になります。