class Solution {
//时间O(n) 空间O(1)
public int trap(int[] height) {
int water = 0;
int leftMax = height[0];
int rightMax = height[height.length - 1];
int left = 0;
int right = height.length - 1;
while(left <= right){
leftMax = Math.max(leftMax,height[left]);
rightMax = Math.max(rightMax,height[right]);
if(leftMax < rightMax){
water += leftMax - height[left];
left++;
}else{
water += rightMax - height[right];
right--;
}
}
return water;
}
}
public int trap(int[] height) {
int n = height.length;
int[] left = new int[n];
int[] right = new int[n];
for(int i = 1; i < n; i++){
left[i] = Math.max(left[i-1],height[i-1]);
}
for(int i = n-2; i > 0; i--){
right[i] = Math.max(right[i+1],height[i+1]);
}
int res = 0;
for(int i = 1; i < n-1; i++){
System.out.println(left[i] +" " + right[i]);
int temp = Math.min(left[i],right[i]);
if(temp > height[i]){
res += temp - height[i];
}
}
return res;
}
class Solution {
public int trap(int[] height) {
int n = height.length;
if (n <= 0) {
return 0;
}
int[] leftMax = new int[n];
leftMax[0] = height[0];
for (int i = 1; i < n; i++) {
leftMax[i] = Math.max(leftMax[i - 1], height[i]);
}
int[] rightMax = new int[n];
rightMax[n - 1] = height[n - 1];
for (int i = n - 2; i >= 0; i--) {
rightMax[i] = Math.max(rightMax[i + 1], height[i]);
}
int ans = 0;
for (int i = 0; i < n; i++) {
ans += Math.min(leftMax[i], rightMax[i]) - height[i];
}
return ans;
}
}
共以下 10 个回答
好难
时间复杂度:O(n)
空间复杂度:O(n)
MY双指针
【思路】双指针法
【复杂度】时间O(n),空间O(1)
用两次dp
动态规划
时间:O(n)
空间:O(n)
“`C++& height) {
int trap(vector
int n = height.size();
if (n < 3) { return 0; // 如果柱子数量小于3,则无法容纳雨水 }
}
“`