题目:最接近的三数之和
- 题号: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) 。
示例2:
输入:nums = [0,0,0], target = 1
输出:0
提示:
- 3 <= nums.length <= 1000
- -1000 <= nums[i] <= 1000
- − 1 0 4 < = t a r g e t < = 1 0 4 -10^4 <= target <= 10^4 −104<=target<=104
实现
第一种:利用暴力算法
执行结果:超出时间限制
public class Solution
{
public int ThreeSumClosest(int[] nums, int target)
{
double error = int.MaxValue;
int sum = 0;
for (int i = 0; i < nums.Length - 2; i++)
for (int j = i + 1; j < nums.Length - 1; j++)
for (int k = j + 1; k < nums.Length; k++)
{
if (Math.Abs(nums[i] + nums[j] + nums[k] - target) < error)
{
sum = nums[i] + nums[j] + nums[k];
error = Math.Abs(sum - target);
}
}
return sum;
}
}
第二种:利用 排序 + 三索引 的方法
C# 语言
public class Solution
{
public int ThreeSumClosest(int[] nums, int target)
{
nums = nums.OrderBy(a => a).ToArray();
int result = nums[0] + nums[1] + nums[2];
for (int i = 0; i < nums.Length - 2; i++)
{
int start = i + 1, end = nums.Length - 1;
while (start < end)
{
int sum = nums[start] + nums[end] + nums[i];
if (Math.Abs(target - sum) < Math.Abs(target - result))
result = sum;
if (sum > target)
end--;
else if (sum < target)
start++;
else
return result;
}
}
return result;
}
}
Pyhton 语言
class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
nums = sorted(nums)
result = nums[0] + nums[1] + nums[2]
for i in range(0, len(nums) - 2):
start = i + 1
end = len(nums) - 1
while start < end:
sum = nums[start] + nums[end] + nums[i]
if abs(target - sum) < abs(target - result):
result = sum
if sum > target:
end -= 1
elif sum < target:
start += 1
else:
return result
return result