github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/algorithm/leetcode/3sum-closest_test.go (about) 1 package leetcode 2 3 import "sort" 4 5 // 16. 最接近的三数之和 https://leetcode-cn.com/problems/3sum-closest/ 6 7 /* 8 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。 9 返回这三个数的和。假定每组输入只存在唯一答案。 10 11 例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2). 12 13 */ 14 15 func threeSumClosest(nums []int, target int) int { 16 // 思路: 1. 排序 17 // 2. 也是使用三指针 18 sort.Slice(nums, func(i, j int) bool { 19 return nums[i] < nums[j] // 正序 20 }) 21 22 length := len(nums) 23 if length < 3 { 24 return 0 25 } 26 ret := nums[0] + nums[1] + nums[2] 27 28 for i := 0; i < length; i++ { 29 l := i + 1 30 r := length - 1 31 if i > 0 && nums[i] == nums[i-1] { // 重复的去掉 32 continue 33 } 34 for l < r { 35 sum := nums[i] + nums[l] + nums[r] 36 if abs(target-ret) == 0 { // 找到目的 37 for l < r && nums[l] == nums[l+1] { // 去重 38 l++ 39 } 40 for l < r && nums[r] == nums[r-1] { // 去重 41 r-- 42 } 43 l++ 44 r-- 45 } else if sum < 0 { 46 l++ 47 } else if sum > 0 { 48 r-- 49 } 50 } 51 } 52 return ret 53 } 54 55 func abs(a int) int { 56 if a > 0 { 57 return a 58 } 59 return -a 60 }