Trapping Rain Water--LeetCode

约定不等于承诺〃 2022-08-07 11:47 22阅读 0赞

题目:

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.

rainwatertrap.png

The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped.Thanks Marcos for contributing this image!

思路:可以在这个序列中找到最高柱子的位置,那么从两头开始找可以盛水的多少,假如从前开始遍历,需要遍历到柱子最高的位置,遍历到当前位置,如果发现当前的柱子比之前记录的最高的柱子高,那么更新,如果没有之前记录的柱子高,那么就可以计算出当前柱子相对之前的高柱子盛水量。

方法二:也可以借助辅助栈,栈中记录的是位置,栈底始终是遍历到当前位置之前最高的柱子,如果发现当前比栈底柱子的高度还要打,那么需要计算从当前柱子到栈底这段空间可以盛水量,然后将当前为主压入栈,知道最后,栈空间可能不为空,这个时候需要清空栈,需要看当前栈中的柱子可以盛水量。

  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. using namespace std;
  5. /*
  6. 这个问题可以使用栈来 也可以不用
  7. */
  8. int TrapRainWater(vector<int>& vec)
  9. {
  10. int i,maxhigh;
  11. maxhigh = 0;
  12. int left=0,right = 0;
  13. int sum =0;
  14. for(i=0;i<vec.size();i++)
  15. if(vec[i] > vec[maxhigh])
  16. maxhigh = i;
  17. for(i=0;i<maxhigh;i++)
  18. {
  19. if(vec[i] < left)
  20. sum +=(left-vec[i]);
  21. else
  22. left = vec[i];
  23. }
  24. for(i=vec.size()-1;i>maxhigh;i--)
  25. {
  26. if(vec[i]<right)
  27. sum += (right-vec[i]);
  28. else
  29. right = vec[i];
  30. }
  31. return sum;
  32. }
  33. int main()
  34. {
  35. int array[]={0,1,0,2,1,0,1,3,2,1,2,1};
  36. vector<int> vec(array,array+sizeof(array)/sizeof(int));
  37. cout<<TrapRainWater(vec)<<endl;
  38. }

两次遍历数组,第一次遍历找每个元素右边最大的元素,第二次遍历寻找每个元素左边最大的元素,同时计算该index可以存放的水容积: min{lefthighest, righthighest}-A[i]

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

发表评论

表情:
评论列表 (有 0 条评论,22人围观)

还没有评论,来说两句吧...

相关阅读