Advertisement
uopspop

Untitled

Jul 5th, 2021
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1.  
  2. class Solution {
  3. public int trap(int[] height) {
  4. if (height.length == 0) return 0;
  5.  
  6. int sum = 0;
  7. Stack<Integer> stack = new Stack<>();
  8. // collect non-increasing heights
  9. for (int i = 0; i < height.length ;i++) {
  10. int h = height[i];
  11. if (stack.size() > 0) {
  12. Integer i_prev = stack.peek();
  13. int h_prev = height[i_prev];
  14. if (h > h_prev) {
  15. // oh!oh! this is non-increasing anymore
  16. sum += collect(height, stack, i);
  17. }
  18. }
  19.  
  20. stack.push(i);
  21. }
  22.  
  23. return sum;
  24. }
  25.  
  26. public int collect(int[] height, Stack<Integer> stack, int i_right) {
  27.  
  28. int sum = 0;
  29. int h_right = height[i_right];
  30. while (true) {
  31. if (stack.size() == 0) break;
  32.  
  33. Integer i_now = stack.peek();
  34. int h_now = height[i_now];
  35.  
  36. if (h_now > h_right) break;
  37. stack.pop(); // if pass, pop it out
  38.  
  39. if (stack.size() == 0) break; // no left height anymore
  40.  
  41. Integer i_left = stack.peek();
  42. int h_left = height[i_left];
  43.  
  44. sum += (Math.min(h_left, h_right) - h_now) * (i_right - i_left - 1);
  45.  
  46. }
  47.  
  48. return sum;
  49.  
  50. }
  51.  
  52. }
  53.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement