Java LeetCode 241的时间和空间复杂度是多少。添加括号的不同方法?
我试图理解LeetCode241的时间复杂性是什么。添加括号的不同方法。我使用了记忆技术。我的朋友在谷歌编码回合中被问到,他不能给出正确的时间和空间复杂度。我在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 代码:Java LeetCode 241的时间和空间复杂度是多少。添加括号的不同方法?,java,time-complexity,space-complexity,divide-and-conquer,Java,Time Complexity,Space Complexity,Divide And Conquer,我试图理解LeetCode241的时间复杂性是什么。添加括号的不同方法。我使用了记忆技术。我的朋友在谷歌编码回合中被问到,他不能给出正确的时间和空间复杂度。我在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] 说明
import java.util.*;
类解决方案{
Map Map=newhashmap();
公共列表diffWaysToCompute(字符串输入){
if(映射容器(输入)){
返回map.get(输入);
}
列表结果=新建ArrayList();
int length=input.length();
for(int i=0;i结果中未添加任何内容,因此添加3。。。
if(result.size()==0){
结果.add(Integer.valueOf(input));
}
返回结果;
}
专用布尔等运算符(字符){
返回字符=='-'| |字符=='*'| |字符=='+';
}
私有void计算和存储结果(字符串输入、列表结果、int i、列表部分1结果、列表部分2结果){
for(整数p1:part1Result){
for(整数p2:part2Result){
int c=0;
开关(输入字符(i)){
格“+”:
c=p1+p2;
打破
案例'-':
c=p1-p2;
打破
案例“*”:
c=p1*p2;
打破
}
结果.添加(c);
}
}
}
}
我在很多网站上都找不到很好的解释
这就是递归树的样子:使用的技术是带记忆的分而治之。
我找到了一些有用的链接
观察
1
方法放置括号1
数学运算符,那么只有1
方法可以放置括号以获得相关结果。例如,对于3+4
,它是(3+4)
2
数学运算符,则有2
种放置括号的方法。例如,对于3+4-2
,该方法将表达式按+
拆分为3
和4-2
,然后按-
拆分为3+4
和2
。所以,这是两种方式3
数学运算符,则为5
结果。例如,1+2-3*4
可以分为1
和2-3*4
,1+2
和3*4
,1+2-3和4。正如我们从2)和3)中了解到的,方法的数量是
2+1+2=5`ways
4
数学运算符,则为14
结果。例如,1+2-3*4+5
可以分为1
和2-3*4+5
,1+2
和3*4+5
,1+2-3
和4+5
,1+2-3*4
和5
。正如我们从2)、3)和4)中了解到的,方法的数量相应地是5+2+2+5=14
421324294193048621679658786208012742900,…
。如你所见,它呈指数增长
这样的数字序列有一个名称,称为
应用你的算法
正如您可能已经意识到的那样,即使在获得由第一个数学运算符拆分的左、右子表达式的结果后,您的算法也将变成指数型
因此,如果存在10个
数学运算符,则在计算第一个配置的结果(表达式被第一个数学运算符拆分)后,它们的编号将为4862
因此,不仅时间复杂度是指数级的,而且空间复杂度也是指数级的,因为您将所有结果保存在一个列表中
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);
}
}
}
}