mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-06 23:28:29 +08:00
Update
This commit is contained in:
@ -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:
|
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)
|
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
|
||||||
|
Reference in New Issue
Block a user