42. 接雨水

image.png
image.png

暴力法

  1. func trap(height []int)int{
  2. l :=len(height)
  3. res :=0
  4. // 起始位置是第一个,而不是0
  5. // 结束位置是倒数第二个,而不是倒数第一个
  6. for i:=1;i<l-1;i++{
  7. leftMax :=height[i]
  8. for k:=i-1;k>=0;k--{
  9. if leftMax<height[k]{
  10. leftMax = height[k]
  11. }
  12. }
  13. if leftMax<=height[i]{
  14. continue
  15. }
  16. rightMax :=height[i]
  17. for j:=i+1;j<l;j++{
  18. if rightMax<height[j]{
  19. rightMax = height[j]
  20. }
  21. }
  22. if rightMax<=height[i]{
  23. continue
  24. }
  25. minVal := min(leftMax,rightMax)
  26. water := minVal-height[i]
  27. res =res+water
  28. }
  29. return res
  30. }
  31. func min(a,b int)int{
  32. if a>b{
  33. return b
  34. }
  35. return a
  36. }

image.png

动态规划

动态规划实际上就是减少暴力中的重复计算问题。
leftDP 表示i 左边的最大值
rightDP表示以i开始右边的最大值

  1. func trap(height []int)int{
  2. if len(height)==0{
  3. return 0
  4. }
  5. size :=len(height)
  6. res :=0
  7. leftDP :=make([]int,size)
  8. rightDP :=make([]int,size)
  9. leftDP[0]= height[0]
  10. rightDP[size-1] = height[size-1]
  11. for i:=1;i<size;i++{
  12. leftDP[i] = max(leftDP[i-1],height[i])
  13. }
  14. for i:=size-2;i>=0;i--{
  15. rightDP[i] = max(rightDP[i+1],height[i])
  16. }
  17. for i:=1;i<size-1;i++{
  18. minHeight := min(leftDP[i],rightDP[i])
  19. waterVal :=minHeight-height[i]
  20. res +=waterVal
  21. }
  22. return res
  23. }
  24. func max(a,b int)int{
  25. if a>b{
  26. return a
  27. }
  28. return b
  29. }
  30. func min(a,b int)int{
  31. if a>b{
  32. return b
  33. }
  34. return a
  35. }

image.png