解析:
还是最大容水量问题,这道题目是做完11题后,leetcode自己推荐给我的,以后准备就按照它的例题推荐来做一道,用以巩固自己的知识点。
思路:
同11题,这道也考虑用左右两个位置来标记。
判断左边和右边两个数的大小,如果左边比右边低,将左位置的高度记为minh,并将左位置右移,右移过程中遇到比minh还低时,则通过减法得到容量并计入总容量;如果右边比左边低,那么同上执行右位置左移。更新左/右位置,重新执行上述过程,直到左右相逢。
时间复杂度:O(N),遍历了整个数组
空间复杂度:O(1)
算法:
class Solution {
public int trap(int[] height) {
int n = height.length;
int res = 0, l = 0, r = n - 1;
while(l < r) {
int minh = Math.min(height[l], height[r]);
if(height[l] == minh)
//++l表示在执行比较前,先对l进行自增计算。不论while的判断是否为真,l都进行了自增。
while(++ l < r && height[l] < minh)
res += minh - height[l];
else
while(l < -- r && height[r] < minh)
res += minh - height[r];
}
return res;
}
}
网友评论