functhreeSum(nums []int) [][]int { ans := make([][]int, 0) // 排序 sort.Sort(sort.IntSlice(nums)) for i := 0; i < len(nums); i++ { // 去重 if i > 0 && nums[i] == nums[i - 1] { continue } jks := twoSum(nums, i + 1, -nums[i]) for _, jk := range jks { ans = append(ans, []int{nums[i], jk[0], jk[1]}) } } return ans }
functwoSum(nums []int, start, target int) [][]int { ans := make([][]int, 0) j := len(nums) - 1 for i := start; i < len(nums); i++ { // 去重 if i > start && nums[i] == nums[i - 1] { continue } for ; i < j && nums[i] + nums[j] > target; { j-- } if i < j && nums[i] + nums[j] == target { ans = append(ans, []int{nums[i], nums[j]}) } } return ans }
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 说明:你不能倾斜容器。
解题思路
盛水多少是由短的那根决定的, 我们可以用i/j分别从头尾向中间夹逼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
import"math"
funcmaxArea(height []int)int { ans, i, j := 0, 0, len(height) - 1 // i, j从两端向中间夹逼 for ; i < j; { fi := float64(height[i]) fj := float64(height[j]) fa := float64(ans) ans = int(math.Max(fa, float64(j - i) * math.Min(fi, fj))) if fi < fj { i++ } else { j-- } } return ans }