题目是:
慢到极致就是快,因为思路太简单了。从看题到解题大概一个小时多。
思路是:
这题我一看嗷,就和水桶那题差不多leetcode 11题LeetCode 11.盛最多水的容器_Eminste的博客-CSDN博客
然后呢有一点 , 不一样就是他是水桶里面有东西的(或者说是有方块占用了空间),
- 我们先从两边开始扫面,取短的那条柱子;
- 然后cmp是表示这一层的水
- 我们先取cmp层的水,假设水不流动.
- 那么取完之后我们将这一层的水全部变成方块.在代码神之一笔处.
- 因为每一次取水都是大于上一次cmp的所以不会重复取水,(大于原cmp,且原来的水取完后都被放上方块了.
图解:
开始:
第一次i到1,j还是len=11;
取水之后;
sum=2;第二次取水 i = 3 , j = 10;
sum=6;
但是如果不将取过水的位置用小方块代替,那么箭头位置会取水两次加二,最后sum也就变成7了,
代码是:
class Solution {
public:
int trap(vector<int>& height) {
int len = height.size() - 1;
int cmp = 0, sum = 0;
for(int i = 0,j = len ; i < j ; ){
if( min( height[i], height[j] ) > cmp ){
cmp=min( height[i], height[j] );
for(int star=i+1 ; star < j; star++){
if(height[star]<cmp){
sum=sum+cmp-height[star];
height[star]=cmp;//神之一笔
}
}
}else{
height[i] <= height[j] ? i++ : j--;
}
}
return sum;
}
};