package main import "fmt" // 接雨水问题 // 给定一个整数数组 // 可以认定为下标为横坐标,值为纵坐标形成的凹槽 // 将雨水泼下时,如何将存储的雨水的总数计入 func main() { arr := []int{0, 1, 0, 2, 0, 1, 2, 0, 4, 3, 0, 1, 0, 3, 1} total := rain(arr) fmt.Println(fmt.Sprintf("total=%v", total)) } // 双指针方法,从左右两侧移动 func rain(arr []int) int { // 雨水总数 rainTotal := 0 if len(arr) < 3 { return rainTotal } // 左右双指针 L := 0 R := len(arr) - 1 // 左右最大值 leftMax := 0 rightMax := 0 // 左指针小于右指针循环持续,当左右两个指针相撞则终止计算 for L < R { // 左指针的值小于右指针,则左指针往右移 // 左指针的值大于等于右指针,则右指针左移 if arr[L] < arr[R] { // 如果当前值大于最大值,则最大值为当前值 if arr[L] > leftMax { leftMax = arr[L] } // 如果最大值大于等于当前值,则计算出当前值与最大值的差值 // 即为储水量 if arr[L] <= leftMax { rainTotal += leftMax - arr[L] } L++ } if arr[L] >= arr[R] { // 如果当前值大于最大值,则最大值为当前值 if arr[R] > rightMax { rightMax = arr[R] } // 如果最大值大于等于当前值,则计算出当前值与最大值的差值 // 即为储水量 if arr[R] <= rightMax { rainTotal += rightMax - arr[R] } R-- } } return rainTotal }
go语言算法-接雨水
最新推荐文章于 2024-06-20 13:44:57 发布