Leetcode16. 最接近的三数之和
题目:
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
题解:
排序+双指针
1.对数组排序;
2.首先取数组前三个数求和ans=nums1(0)+nums1(1)+nums1(2)ans= nums1(0) + nums1(1) + nums1(2)ans=nums1(0)+nums1(1)+nums1(2);
3.循环遍历数组,固定一个值: nums[i]nums[i]nums[i];
3.1.指定双指针j=i+1j=i+1j=i+1 ,k=nums.length−1k=nums.length-1k=nums.length−1
3.2.定义:sum=nums1(i)+nums1(j)+nums1(k)sum = nums1(i) + nums1(j) + nums1(k)sum=nums1(i)+nums1(j)+nums1(k),
3.2.1如果sum距离target比ans距离target近,将ans赋值为sum,
3.2.2.如果sum > target,k=k-1
3.2.3.如果sum<target,j = j+1
3.2.4.如果sum=target,跳出循环
scala代码:
/**
* 例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
* 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
*
*
* @param nums
* @param target
* @return
*/
def threeSumClosest(nums: Array[Int], target: Int): Int = {
val nums1 = nums.sorted
var ans = nums1(0) + nums1(1) + nums1(2)
breakable {
for (i <- 0 until nums1.length) {
var j = i + 1
var k = nums1.length - 1
while (j < k) {
val sum = nums1(i) + nums1(j) + nums1(k)
if (math.abs(sum - target) < math.abs(ans - target)) {
ans = sum
}
if (sum > target) {
k = k - 1
} else if (sum < target) {
j = j + 1
} else {
break()
}
}
}
}
ans
}