Skip to content

Commit 66e6953

Browse files
Update
1 parent 00da9c6 commit 66e6953

File tree

1 file changed

+37
-34
lines changed

1 file changed

+37
-34
lines changed

problems/0042.接雨水.md

Lines changed: 37 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -136,40 +136,6 @@ public:
136136

137137

138138

139-
一种更简便的双指针方法:
140-
141-
之前的双指针方法的原理是固定“底”的位置,往两边找比它高的“壁”,循环若干次求和。
142-
143-
我们逆向思维,把“壁”用两个初始位置在数组首末位置的指针表示,“壁”往中间推,同样可以让每个“底”都能找到最高的“壁”
144-
145-
本质上就是改变了运算方向,从而减少了重复运算
146-
147-
代码如下:
148-
149-
```C
150-
int trap(int* height, int heightSize) {
151-
int ans = 0;
152-
int left = 0, right = heightSize - 1; //初始化两个指针到左右两边
153-
int leftMax = 0, rightMax = 0; //这两个值用来记录左右的“壁”的最高值
154-
while (left < right) { //两个指针重合就结束
155-
leftMax = fmax(leftMax, height[left]);
156-
rightMax = fmax(rightMax, height[right]);
157-
if (leftMax < rightMax) {
158-
ans += leftMax - height[left]; //这里考虑的是下标为left的“底”能装多少水
159-
++left;//指针的移动次序是这个方法的关键
160-
//这里左指针右移是因为左“墙”较矮,左边这一片实际情况下的盛水量是受制于这个矮的左“墙”的
161-
//而较高的右边在实际情况下的限制条件可能不是当前的左“墙”,比如限制条件可能是右“墙”,就能装更高的水,
162-
}
163-
else {
164-
ans += rightMax - height[right]; //同理,考虑下标为right的元素
165-
--right;
166-
}
167-
}
168-
return ans;
169-
}
170-
```
171-
时间复杂度 O(n)
172-
空间复杂度 O(1)
173139

174140
## 动态规划解法
175141

@@ -569,6 +535,43 @@ Go:
569535

570536
JavaScript:
571537

538+
C:
539+
540+
一种更简便的双指针方法:
541+
542+
之前的双指针方法的原理是固定“底”的位置,往两边找比它高的“壁”,循环若干次求和。
543+
544+
我们逆向思维,把“壁”用两个初始位置在数组首末位置的指针表示,“壁”往中间推,同样可以让每个“底”都能找到最高的“壁”
545+
546+
本质上就是改变了运算方向,从而减少了重复运算
547+
548+
代码如下:
549+
550+
```C
551+
int trap(int* height, int heightSize) {
552+
int ans = 0;
553+
int left = 0, right = heightSize - 1; //初始化两个指针到左右两边
554+
int leftMax = 0, rightMax = 0; //这两个值用来记录左右的“壁”的最高值
555+
while (left < right) { //两个指针重合就结束
556+
leftMax = fmax(leftMax, height[left]);
557+
rightMax = fmax(rightMax, height[right]);
558+
if (leftMax < rightMax) {
559+
ans += leftMax - height[left]; //这里考虑的是下标为left的“底”能装多少水
560+
++left;//指针的移动次序是这个方法的关键
561+
//这里左指针右移是因为左“墙”较矮,左边这一片实际情况下的盛水量是受制于这个矮的左“墙”的
562+
//而较高的右边在实际情况下的限制条件可能不是当前的左“墙”,比如限制条件可能是右“墙”,就能装更高的水,
563+
}
564+
else {
565+
ans += rightMax - height[right]; //同理,考虑下标为right的元素
566+
--right;
567+
}
568+
}
569+
return ans;
570+
}
571+
```
572+
时间复杂度 O(n)
573+
空间复杂度 O(1)
574+
572575
573576
-----------------------
574577
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)

0 commit comments

Comments
 (0)