From 66e69535a36497ada74284e69b6ff087b22a4eed Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Sat, 18 Sep 2021 09:05:06 +0800 Subject: [PATCH] Update --- problems/0042.接雨水.md | 71 ++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 34 deletions(-) diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md index 83b3f82c..16c788eb 100644 --- a/problems/0042.接雨水.md +++ b/problems/0042.接雨水.md @@ -136,40 +136,6 @@ public: -一种更简便的双指针方法: - -之前的双指针方法的原理是固定“底”的位置,往两边找比它高的“壁”,循环若干次求和。 - -我们逆向思维,把“壁”用两个初始位置在数组首末位置的指针表示,“壁”往中间推,同样可以让每个“底”都能找到最高的“壁” - -本质上就是改变了运算方向,从而减少了重复运算 - -代码如下: - -```C -int trap(int* height, int heightSize) { - int ans = 0; - int left = 0, right = heightSize - 1; //初始化两个指针到左右两边 - int leftMax = 0, rightMax = 0; //这两个值用来记录左右的“壁”的最高值 - while (left < right) { //两个指针重合就结束 - leftMax = fmax(leftMax, height[left]); - rightMax = fmax(rightMax, height[right]); - if (leftMax < rightMax) { - ans += leftMax - height[left]; //这里考虑的是下标为left的“底”能装多少水 - ++left;//指针的移动次序是这个方法的关键 - //这里左指针右移是因为左“墙”较矮,左边这一片实际情况下的盛水量是受制于这个矮的左“墙”的 - //而较高的右边在实际情况下的限制条件可能不是当前的左“墙”,比如限制条件可能是右“墙”,就能装更高的水, - } - else { - ans += rightMax - height[right]; //同理,考虑下标为right的元素 - --right; - } - } - return ans; -} -``` -时间复杂度 O(n) -空间复杂度 O(1) ## 动态规划解法 @@ -569,6 +535,43 @@ Go: JavaScript: +C: + +一种更简便的双指针方法: + +之前的双指针方法的原理是固定“底”的位置,往两边找比它高的“壁”,循环若干次求和。 + +我们逆向思维,把“壁”用两个初始位置在数组首末位置的指针表示,“壁”往中间推,同样可以让每个“底”都能找到最高的“壁” + +本质上就是改变了运算方向,从而减少了重复运算 + +代码如下: + +```C +int trap(int* height, int heightSize) { + int ans = 0; + int left = 0, right = heightSize - 1; //初始化两个指针到左右两边 + int leftMax = 0, rightMax = 0; //这两个值用来记录左右的“壁”的最高值 + while (left < right) { //两个指针重合就结束 + leftMax = fmax(leftMax, height[left]); + rightMax = fmax(rightMax, height[right]); + if (leftMax < rightMax) { + ans += leftMax - height[left]; //这里考虑的是下标为left的“底”能装多少水 + ++left;//指针的移动次序是这个方法的关键 + //这里左指针右移是因为左“墙”较矮,左边这一片实际情况下的盛水量是受制于这个矮的左“墙”的 + //而较高的右边在实际情况下的限制条件可能不是当前的左“墙”,比如限制条件可能是右“墙”,就能装更高的水, + } + else { + ans += rightMax - height[right]; //同理,考虑下标为right的元素 + --right; + } + } + return ans; +} +``` +时间复杂度 O(n) +空间复杂度 O(1) + ----------------------- * 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)