我一直在研究以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并粘贴在下方
上述总和将最终成为:
Sum = n * [n + n(n-1)]/ 2 = n * [n + n^2- n)]/ 2 = (n^3)/2
会给O(n^3)
。
我的推理出错了什么?它似乎是O(n ^ 2),因为GeeksForGeeks也指出了它。
答案 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
n
份n * n
副本,您只有n^2
个O(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);
。