@@ -136,40 +136,6 @@ public:
136
136
137
137
138
138
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)
173
139
174
140
## 动态规划解法
175
141
569
535
570
536
JavaScript:
571
537
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
+
572
575
573
576
-----------------------
574
577
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
0 commit comments