收集雨水算法复杂度
Trapping rain water algorithm complexity
正在尝试解决 Trapping Rain Water 问题,但无法理解为什么我的解决方案未通过复杂性检查:
public int Trap(int[] height) {
int res = 0;
int chk = 0;
for(int i = 1; i < height.Length; i++){
chk = Math.Min(height[..i].Max(),height[i..].Max())-height[i];
if(chk > 0){
res += chk;
}
}
return res;
}
Compile: 0.024s
Execute: 0.85s
Memory: 3.90Mb
CPU: 0.874s
但是这个(推荐)通过了:
public int Trap(int[] land) {
var wall = 0;
var water = new int[land.Length];
for(var i = 0; i < water.Length; i++) {
wall = Math.Max(wall, land[i]);
water[i] = wall - land[i];
}
wall = 0;
var sum = 0;
for(var i = water.Length - 1; i >= 0; i--) {
wall = Math.Max(wall, land[i]);
water[i] = Math.Min(water[i], wall - land[i]);
sum += water[i];
}
return sum;
}
Compile: 0.024s
Execute: 0.03s
Memory: 0b
CPU: 0.054s
为什么差别这么大?是因为数组slice[..i]
?
数组切片操作的时间复杂度为O(N)。
因此,您的代码的总时间复杂度变为 O(N2)。
这就是 TLE.
的原因
虽然推荐的代码仅在 O(N) 时间复杂度内解决了该问题。
正在尝试解决 Trapping Rain Water 问题,但无法理解为什么我的解决方案未通过复杂性检查:
public int Trap(int[] height) {
int res = 0;
int chk = 0;
for(int i = 1; i < height.Length; i++){
chk = Math.Min(height[..i].Max(),height[i..].Max())-height[i];
if(chk > 0){
res += chk;
}
}
return res;
}
Compile: 0.024s
Execute: 0.85s
Memory: 3.90Mb
CPU: 0.874s
但是这个(推荐)通过了:
public int Trap(int[] land) {
var wall = 0;
var water = new int[land.Length];
for(var i = 0; i < water.Length; i++) {
wall = Math.Max(wall, land[i]);
water[i] = wall - land[i];
}
wall = 0;
var sum = 0;
for(var i = water.Length - 1; i >= 0; i--) {
wall = Math.Max(wall, land[i]);
water[i] = Math.Min(water[i], wall - land[i]);
sum += water[i];
}
return sum;
}
Compile: 0.024s
Execute: 0.03s
Memory: 0b
CPU: 0.054s
为什么差别这么大?是因为数组slice[..i]
?
数组切片操作的时间复杂度为O(N)。
因此,您的代码的总时间复杂度变为 O(N2)。
这就是 TLE.
虽然推荐的代码仅在 O(N) 时间复杂度内解决了该问题。