【发布时间】:2021-05-19 01:48:57
【问题描述】:
我想了解什么是 leetcode 241 的时间复杂度。添加括号的不同方法。我使用了记忆技术。我的朋友在谷歌编码轮中被问到,他无法给出正确的时间和空间复杂度。我在 Leetcode 中发现了同样的问题。
问题: 给定一串数字和运算符,返回计算所有可能的数字和运算符分组方式的所有可能结果。有效的运算符是 +、- 和 *。
示例 1:
输入:“2-1-1”
输出:[0, 2]
解释:
((2-1)-1) = 0
(2-(1-1)) = 2
示例 2:
输入:“2 * 3 - 4 * 5”
输出:[-34, -14, -10, -10, 10]
解释:
(2*(3-(4*5))) = -34
((23)-(45)) = -14
((2*(3-4))*5) = -10
(2*((3-4)*5)) = -10
(((2*3)-4)*5) = 10
代码:
import java.util.*;
class Solution {
Map<String, List<Integer>> map = new HashMap<>();
public List<Integer> diffWaysToCompute(String input) {
if(map.containsKey(input)) {
return map.get(input);
}
List<Integer> result = new ArrayList<>();
int length = input.length();
for(int i = 0; i< length; i++) {
char character = input.charAt(i);
if(isOperator(character)) {
String part1 = input.substring(0, i);
String part2 = input.substring(i + 1);
List<Integer> part1Result = diffWaysToCompute(part1);
List<Integer> part2Result = diffWaysToCompute(part2);
computeAndStoreResult(input, result, i, part1Result, part2Result);
}
}
//store in map...
map.put(input, result);
//this is when only one input is present.
// input 3 ==> nothing is added in result so add 3 ...
if(result.size() == 0) {
result.add(Integer.valueOf(input));
}
return result;
}
private boolean isOperator(char character) {
return character == '-' || character == '*' || character == '+';
}
private void computeAndStoreResult(String input, List<Integer> result, int i, List<Integer> part1Result, List<Integer> part2Result) {
for(Integer p1 : part1Result) {
for(Integer p2 : part2Result) {
int c= 0;
switch (input.charAt(i)) {
case '+':
c = p1+p2;
break;
case '-':
c = p1-p2;
break;
case '*':
c = p1*p2;
break;
}
result.add(c);
}
}
}
}
我研究了很多网站都找不到很好的解释 这就是递归树的样子:使用的技术是分而治之的记忆化。
我发现的一些有用的链接。
【问题讨论】:
标签: java time-complexity space-complexity divide-and-conquer