leetcode题库 16. 最接近的三数之和
原题信息
原题链接:
https://leetcode-cn.com/problems/3sum-closest/
难度等级
中等
原题描述
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。
返回这三个数的和。假定每组输入只存在唯一答案。
示例 1:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
提示:
3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4
构思
暴力遍历前两个数,在寻找第三个数,直接第三个数常规遍历会超时,因此得加入限制条件才可以。
最好先对数组排序,好处是可以在合适的位置跳出循环,减少没有必要的遍历。
对排序好的数组,最好使用二分法查找
实现
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| func twodivde(nums []int, target int)int{ if len(nums)==2{ if math.Abs(float64(nums[0]-target))-math.Abs(float64(nums[1]-target))>0{ return nums[1] }else{ return nums[0] } } length:= len(nums)-1 if length%2==0{ length=length/2 }else{ length=(length-1)/2 } if target == nums[length]{ return target }else if target > nums[length]{ return twodivde(nums[length:],target) }else{ return twodivde(nums[:length+1],target) } }
func threeSumClosest(nums []int, target int) int { result:=0 lastx:=float64(10000)
ttt:=0 sort.Ints(nums) for i1 := 0;i1<=len(nums)-3;i1++{ lastnum3:=9999 for i2:=i1+1;i2<=len(nums)-2;i2++{ num3:=(target-nums[i1])-nums[i2] if num3>nums[len(nums)-1]{ ttt= nums[len(nums)-1]+nums[i2]+nums[i1] }else if num3<nums[i2+1]{ ttt= nums[i2+1]+nums[i2]+nums[i1] }else{ ttt=twodivde(nums,num3)+nums[i2]+nums[i1] } if ttt-target==0{ return ttt } if math.Abs(float64(ttt-target))-math.Abs(lastx)<0{ lastx=float64(ttt-target) result=ttt } if ttt-target>0 && ttt-lastnum3>0{ break }else{ lastnum3=ttt } } } return result }
|
代码链接
https://github.com/lennon-liu/leetcode/tree/main/lennon16
测试结果
优化与总结
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。