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  }