您的位置:首页 > 其它

【leetcode每日一题】【2019-05-27】16. 最接近的三数之和

2019-05-28 11:08 453 查看

16. 最接近的三数之和

地址: https://leetcode-cn.com/problems/3sum-closest/submissions/

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

暴力法肯定是可以的,但是也肯定是超时的。
看了下解题思路
首先定位一个数字,然后找左边和右边的数字 双指针移动,可以提高效率

Python代码:

class Solution:
def threeSumClosest(self, nums , target: int) -> int:
nums.sort()
print(nums)
minnum=target
min_abs=99999
for i in range(1,len(nums)-1):
left=0
right=len(nums)-1
new_target=target-nums[i]
while left <i and right>i :
print("[%s:%s:%s]"%(i,left,right))
total=nums[i]+nums[left]+nums[right]
min_abs_t=abs(target-total)
print("i:%s:%s  left:%s:%s   right:%s:%s   total:%s    min_abs:%s   min_abs_t:%s"%(i,nums[i],left,nums[left],right,nums[right],total,min_abs,min_abs_t))
if min_abs_t<min_abs:
minnum=total
min_abs=min_abs_t
if target-total==0:
return target
elif target-total>0:
left = left + 1
else:
right = right - 1
return minnum

Scala代码:

object Solution {
def threeSumClosest(nums: Array[Int], target: Int): Int = {
scala.util.Sorting.quickSort(nums)
var minnum = target
var min_abs = 99999
for (i <- 1 to nums.length-1){
var left=0
var right=nums.length-1
var new_target=target-nums(i)
while ( left < i && right > i ){
var total=nums(i)+nums(left)+nums(right)
var min_abs_t=Math.abs(target-total)
if (min_abs_t<min_abs){
minnum=total
min_abs=min_abs_t
}
if (target-total==0){
return target
}else if (target-total>0){
left = left + 1
}else{
right = right - 1
}
}

}
return minnum
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: