我试图理解什么是leetcode 241的时间复杂性。添加括号的不同方式。我用了回忆录技术。我的朋友被问到在谷歌编码轮,他不能给出正确的时间和空间复杂度。我在Leetcode中也发现了同样的问题。
问题:给定一串数字和运算符,返回所有可能的结果,从计算所有不同的可能方法,以分组数字和运算符。有效运算符是+、-和*。
例1:
((2-1)-1)=0
(2-(1-1))=2
例2:
说明:
(2*(3-(4*5)))=-34
((23)-(45))=-14
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);
}
}
}
}
https://just4once.gitbooks.io/leetcode-notes/content/leetcode/divide-and-conquer/241-不同的-ways-to-add-parenthes.html
1
放置圆括号的方法。1
数学运算符,那么只有1
放置圆括号以获得相关结果的方法。例如,对于3+4
,它是(3+4)
.2
数学运算符,则有2
放置圆括号的方法。例如,对于3+4-2
,该方法将通过+
将表达式拆分为3
和4-2
,然后通过-
将表达式拆分为3+4
和2
。所以,它是2
方式。3
数学运算符,则为5
结果。例如,1+2-3*4
可以拆分为1
和2-3*4
、1+2
和3*4
、1+2-3和
4。我们从2)和3)中了解到,ways的数量是
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
。正如我们从2)、3)和4)中学到的,方法的数量是5+2+2+5=14
ways。如果继续这个序列,那么它将是42、132、429、1430、4862、16796、58786、208012、742900、...
。如你所见,它呈指数增长。
这样的数字序列有一个名字,叫做加泰罗尼亚数字。
正如您可能已经意识到的那样,即使在您获得由第一个数学运算符拆分的左子表达式和右子表达式的结果后,您的算法也将变得指数化。
因此,如果有10
数学运算符,那么在计算第一个配置的结果(表达式被第一个数学运算符拆分)之后,它们的数目将是4862
。
所以,不仅你的时间复杂度是指数的,而且你的空间复杂度,因为你把所有的结果都保存在一个列表中。
问题陈述:给定一个非空字符串s和一个包含非空单词列表的字典字词,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。返回所有这些可能的句子。 我的解决方案: 我不确定时间和空间的复杂性。我认为它应该是2^n,其中n是给定字符串s的长度。谁能帮我证明时间和空间的复杂性? 我还有以下几个问题: 如果我不在GetAllSences函数中使用memo,那么在本例中时间复杂度是多少? 还有比这更好
问题内容: 我写了以下课程: 然后,在我的方法中,我创建了一个,向其中添加了一些具有“ X”和“ angle”字段的对象。 然后,我使用: 这种排序方法的复杂性是什么? 问题答案: 您可能已经阅读了有关Collections排序的文档,但是这里适合您: 排序算法是一种修改的mergesort(如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。该算法提供了有保证的n log(n)性能。
问题内容: 我当时在看这个pycon演讲,时间是34:30,发言人说,可以在中完成获取元素列表中最大的元素的操作。 那怎么可能?我的理解是,创建堆将是,但是其本身的复杂性是还是(以及(实际的算法是什么))? 问题答案: 扬声器在这种情况下是错误的。实际费用为。仅在可迭代的第一个元素上调用堆化。就是那个,但如果小于,则微不足道。然后,将所有剩余的元素一次通过添加到此“小堆”中。每次调用需要花费时间。
主要内容:时间复杂度,空间复杂度《 算法是什么》一节提到,解决一个问题的算法可能有多种,这种情况下,我们就必须对这些算法进行取舍,从中挑选出一个“最好”的。 算法本身是不分“好坏”的,所谓“最好”的算法,指的是最适合当前场景的算法。挑选算法时,主要考虑以下两方面因素: 执行效率:根据算法所编写的程序,执行时间越短,执行效率就越高; 占用的内存空间:不同算法编写出的程序,运行时占用的内存空间也不相同。如果实际场景中仅能使用少量的内
我有一个算法可以检查是否可以解决游戏行。游戏行是一个正整数数组,其中最后一个元素为 0。游戏标记从索引 0 开始,沿着数组移动它所在的整数指示的步数。 例如,[1,1,0]返回true,而[1,2,0]返回false。标记也可以向左或向右移动以解决游戏。也就是说,[3,3,2,2,0]是可解的。 我尝试了一些游戏行示例,并计算了最坏情况下的时间复杂度: 其他情况下给我的数字,我找不到与输入大小的关
注:∈/ 意思是不在,我不能在代码中输入。 这个问题可能与一些帖子重复。 理解Dijkstra算法的时间复杂度计算 Dijkstra算法的复杂性 Dijkstras算法的复杂性 我读过它们,甚至读过Quora上的一些帖子,但仍然无法理解。我在伪代码中添加了一些注释,并试图解决它。我真搞不懂为什么它是O(E log V)