当前位置: 首页 > 知识库问答 >
问题:

雨水收集的时间复杂性

聂煜
2023-03-14

从方法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个答案

秦才
2023-03-14

该算法的复杂性也可以通过考虑您有2个嵌套循环这一事实来更容易地看出。所有内部操作都是O(1),因此无论如何它们都不会增加复杂性。考虑嵌套循环,很明显该算法是有序的O(n^2),因为循环的范围是n并且步骤是1

温举
2023-03-14

问题在于:

此处执行的总操作数为:n 2n 3n 4n n(n-1)n^2

但是表的每一行只是n,而不是n,2n,..., n^2

快速浏览一下,很明显你也正确地填写了表格:内部循环有O(n)恒定的时间步长。

您正在做的所有其余数学都是正确的,但无关紧要。要总结nn副本,您只需多个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