LeetCode演算法題16:最接近的三數之和解析
阿新 • • 發佈:2019-01-03
給定一個包括 n 個整數的陣列 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。
例如,給定陣列 nums = [-1,2,1,-4], 和 target = 1.
與 target 最接近的三個數的和為 2. (-1 + 2 + 1 = 2).
這個題和三數之和那個題基本一樣,甚至思想更簡單了一些,只需要設定一個差值,每次三數相加時對比差值,如果更小就儲存三數之和,而且這個題不需要去掉重複項,遍歷的思路還是一樣,先排序,然後逐個遍歷,利用雙指標將之後剩餘數都遍歷一遍算加和再比價差值即可。
C++原始碼:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int res = nums[0]+nums[1]+nums[2];
int diff = abs(res-target);
sort(nums.begin(), nums.end());
for (int k=0;k<nums.size()-2;k++)
{
int i = k+1 ;
int j = nums.size()-1;
while (i<j)
{
int sum = nums[k] + nums[i] + nums[j];
if (abs(sum-target) < diff)
{
diff = abs(sum-target);
res = sum;
}
if (sum<target) i++;
else j--;
}
}
return res;
}
};
python3原始碼:
class Solution:
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
res = sum(nums[0:3])
diff = abs(res-target)
nums.sort()
for k in range(len(nums)-2):
i = k+1
j = len(nums)-1
while i<j:
threeSum = nums[k] + nums[i] + nums[j]
if abs(threeSum-target)<diff:
diff = abs(threeSum-target)
res = threeSum
if threeSum<target:
i += 1
else:
j -= 1
return res