LeetCode42——Trapping Rain Water

本是古典 何须时尚 2022-08-09 09:55 176阅读 0赞

LeetCode42——Trapping Rain Water

题意:

看图就很明显。

但是做起来就没想象的简单了。。。

我最初的疑惑:

如果序列是这种情况01010,也就是说“凹点”两边都是“凸点”这样就简单了,直接根据短板原理可求,遍历求出索引为i-1和i+1的value的最小值即可。。。

但是如果遇到这种情况21012,也就是中间0的凹点,两边的壁呈递增,就懵逼了。。。

想了很久,口述还是不清楚,画个图吧:

SouthEast

图就一目了然了,事实上,我们把索引2处的水注与索引1,3的水分开成单独的水柱(虽然物理上不可能),那么在求解的时候,分别算出索引2处左右的最长的“隔板”(这里可以是隔空的),再求出这两者的最小值,减去索引2处的高度(此处为0),就是索引2处矩形水柱的高度了。

代码:

  1. class Solution {
  2. public:
  3. int trap(vector<int>& height) {
  4. int curMax = 0;
  5. int len = height.size();
  6. vector<int>leftMax(len);
  7. vector<int>rightMax(len);
  8. for (int i = 0; i < len; i++)
  9. {
  10. leftMax[i] = curMax;//左边最大值
  11. curMax = max(curMax, height[i]);//当前最大值
  12. }
  13. curMax = 0;
  14. for (int i = len - 1; i >= 0; i--)
  15. {
  16. rightMax[i] = curMax;
  17. curMax = max(curMax,height[i]);
  18. }
  19. int sum=0;
  20. for (int i = 0; i < len; i++)
  21. {
  22. if (leftMax[i] != 0 && rightMax[i] != 0)
  23. {
  24. int temp = min(leftMax[i], rightMax[i]) - height[i];
  25. if (temp > 0)
  26. sum += temp;
  27. }
  28. }
  29. //debuging
  30. //while (1)
  31. //{
  32. // int a;
  33. // int b;
  34. //}
  35. return sum;
  36. }
  37. };

发表评论

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

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

相关阅读