诱捕雨水的时间复杂性

时间:2018-06-11 21:07:38

标签: python c++ arrays algorithm big-o

我一直在研究以problem开头的Leetcode approach 1的不同算法。如果阵列值是墙的高度,则问题需要计算总水面积(柱宽= 1)。

第一种方法是找到每列左侧和右侧最大墙高的最小高度,如果柱高小于最小值,则将水添加到给定柱的顶部。取最小值,因为这是收集的水可以达到的最高值。要计算每一方的最大值,需要对左侧和右侧进行n-1遍历。

我在Python中编码,但这里是C ++中的代码,根据Leetcode给出的解决方案。问题不在于理解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 * (a_1 + a_n)/2获得here并粘贴在下方 Arithmetic series formulas

上述总和将最终成为:

Sum = n * [n + n(n-1)]/ 2 = n * [n + n^2- n)]/ 2 = (n^3)/2

会给O(n^3)

我的推理出错了什么?它似乎是O(n ^ 2),因为GeeksForGeeks也指出了它。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

问题在于:

  

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

但是,您的每一行只有n,而不是n, 2n, …, n^2

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

你所做的所有剩下的数学运算都是正确的,但无关紧要。总结n nn * n副本,您只有n^2O(n^3),当然是system.out.println,而不是while (i < end){ i++; limit = (i + limit); } System.out.println("The sum of the numbers in between 0 and " + end + " is i = " + limit);