leetcode42 接雨水

举报
兔老大 发表于 2021/04/23 01:20:30 2021/04/23
【摘要】 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。  示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6   思...

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

示例:

输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

 

思路1:正着遍历求出代表左边最大值的数组,倒着遍历求出代表右边最大值的数组

每个位置的雨水就是左右低的那个-自己

注意:可能减出负数,这种情况答案为0.


  
  1. class Solution {
  2. public int trap(int[] height) {
  3. int len=height.length;
  4. if(len==0){
  5. return 0;
  6. }
  7. int[] left=new int[len];
  8. int[] right=new int[len];
  9. left[0]=height[0];
  10. for(int i=1;i<len;i++){
  11. left[i]=Math.max(height[i],left[i-1]);
  12. }
  13. right[len-1]=height[len-1];
  14. for(int i=len-2;i>=0;i--){
  15. right[i]=Math.max(height[i],right[i+1]);
  16. }
  17. int ans=0;
  18. for(int i=1;i<len-1;i++){
  19. ans+=Math.max(0,Math.min(left[i-1],right[i+1])-height[i]);
  20. }
  21. return ans;
  22. }
  23. }

思路2:

双指针,优势是空间O(1)

我实在不想写解释了/


  
  1. public class Solution {
  2. public int trap(int[] height) {
  3. int len = height.length;
  4. if (len < 3) {
  5. return 0;
  6. }
  7. int res = 0;
  8. int leftMax = height[0];
  9. int rightMax = height[len - 1];
  10. // 头和尾都不存雨水
  11. int left = 1;
  12. int right = len - 2;
  13. while (left <= right) {
  14. int minVal = Math.min(leftMax, rightMax);
  15. if (minVal == leftMax) {
  16. if (minVal > height[left]) {
  17. res += minVal - height[left];
  18. }
  19. leftMax = Math.max(leftMax, height[left]);
  20. left++;
  21. } else {
  22. if (minVal > height[right]) {
  23. res += minVal - height[right];
  24. }
  25. rightMax = Math.max(rightMax, height[right]);
  26. right--;
  27. }
  28. }
  29. return res;
  30. }
  31. }

时间空间表现并不好,和思路1差不多。

猜测是用Math.max()所以慢了。

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/103418095

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。