从方法1开始,我一直在研究Leetcode问题的不同算法。如果阵列值是墙的高度,则需要计算总水域面积(列宽=1)。
第一种方法是找出每根立柱左右两侧最大墙高的最小高度,如果立柱高度小于最小值,则向给定立柱顶部加水。取最小值,因为这是收集的水能够达到的最高值。要计算每侧的最大值,需要对左侧和右侧进行n-1次遍历。
我用Python编写代码,但下面是根据Leetcode上给出的解决方案用C编写的代码。问题不在于理解C,而在于理解代码后解释的数学。
int trap(vector<int>& height)
{
int ans = 0;
int size = height.size();
for (int i = 1; i < size - 1; i++) {
int max_left = 0, max_right = 0;
for (int j = i; j >= 0; j--) { //Search the left part for max bar size
max_left = max(max_left, height[j]);
}
for (int j = i; j < size; j++) { //Search the right part for max bar size
max_right = max(max_right, height[j]);
}
ans += min(max_left, max_right) - height[i];
}
return ans;
}
我不明白的是它们是如何达到时间复杂性O(n^2)的。我得到了O(n^3)。
Index | Comparisons/Traversals
-------------------------------
1 | n
2 | n
3 | n
4 | n
. | .
. | .
. | .
n-1 | n
此处执行的总操作数为:n 2n 3n 4n n(n-1)n^2
上面的总和最终将是:
Sum = n * [n + n(n-1)]/ 2 = n * [n + n^2- n)]/ 2 = (n^3)/2
这将给出O(n^3)。
我的推理错了什么?它似乎是O(n^2),因为GeeksForGeeks也指出了这一点。
该算法的复杂性也可以通过考虑您有2个嵌套循环这一事实来更容易地看出。所有内部操作都是O(1)
,因此无论如何它们都不会增加复杂性。考虑嵌套循环,很明显该算法是有序的O(n^2)
,因为循环的范围是n
并且步骤是1
。
问题在于:
此处执行的总操作数为:n 2n 3n 4n n(n-1)n^2
但是表的每一行只是n
,而不是n,2n,..., n^2
。
快速浏览一下,很明显你也正确地填写了表格:内部循环有O(n)
恒定的时间步长。
您正在做的所有其余数学都是正确的,但无关紧要。要总结n
的n
副本,您只需多个n*n
,这当然是n^2
,而不是O(n^3)
。
我最近遇到了亚马逊提出的一个面试问题,我无法找到一个优化的算法来解决这个问题: 给定一个输入数组,每个元素表示线塔的高度。每个塔的宽度为1。开始下雨了。塔之间收集了多少水? 实例 另一个例子 起初我认为这可以通过库存跨度问题来解决(http://www.geeksforgeeks.org/the-stock-span-problem/)但我错了,所以如果有人能想出一个时间优化的算法来解决这个问题,
主要内容:时间复杂度,空间复杂度《 算法是什么》一节提到,解决一个问题的算法可能有多种,这种情况下,我们就必须对这些算法进行取舍,从中挑选出一个“最好”的。 算法本身是不分“好坏”的,所谓“最好”的算法,指的是最适合当前场景的算法。挑选算法时,主要考虑以下两方面因素: 执行效率:根据算法所编写的程序,执行时间越短,执行效率就越高; 占用的内存空间:不同算法编写出的程序,运行时占用的内存空间也不相同。如果实际场景中仅能使用少量的内
问题内容: ES6规范为键集合(Set,Map,WeakSet和WeakMap)提供什么时间复杂度(大O表示)? 我的期望,我期望的大多数开发人员,是规范和实现将使用被广泛接受的高性能算法,在这种情况下,并在平均情况下都是O(1)。这同样适用于和等效物。 对我来说,实现的时间复杂性是否在例如ECMAScript 2015 Language Specification-6th Edition — 2
这道题是 LeetCode 42 题。 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 这道题乍一看和 LeetCode 84 柱状图中最大的矩形很像。事实上,84 题的很多解法都可以套到这道题上。 通用的优化方法 这道题有一个通用的优化方法。把柱子想象成下图的曲线,雨水只能存储在柱子之间的“谷”里,因此可以跳过左侧和右侧的上升坡,只遍历中间的柱
有人能帮我了解一下这个代码片段的时间和空间复杂性吗?请参考leetcode问题-单词中断II。给定一个非空字符串s和一个包含非空单词列表的字典单词dict,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。返回所有这些可能的句子。
给定一个非空字符串s和一个包含非空单词列表的字典字词,确定s是否可以被分割成一个或多个字典单词的空格分隔序列。您可以假定字典不包含重复的单词。 例如,给定s=“leetcode”,dict=[“leet”,“code”]。 返回true,因为“leetcode”可以分段为“leetcode”。 朴素解给出如下: 时间复杂度被列为O(n^n),因为这是递归树的大小。我完全同意递归树的最后一层有n^n