一道难点并不在于编程和逻辑的算法题,更像是脑筋急转弯
从左右两侧向中间移动两根指针,同时保留两侧最大值
class Solution { public int trap(int[] height) { if (height==null||height.length < 3) { return 0; // impossible to contain water in this situation } int left = 0; //initiate left pointer int right = height.length - 1; //initiate right pointer int leftMax = height[left]; //the bound in left int rightMax = height[right];//the bound in right int res = 0; while (left < right) { if (height[left] <= height[right]) { if (height[left] > leftMax) { leftMax = height[left++]; } else { res += leftMax - height[left++]; } } else { if (height[right] > rightMax) { rightMax = height[right--]; } else { res += rightMax - height[right--]; } } } return res; } }
time: O(n)
space: O(1)