今天继续刷LeetCode,第16题,找到数组中三个数的组合相加的和与目标最近的组合的和。
分析:
类似上一个题目,只是找到三个数的组合的时候需要判断与目标的距离是否最小。同样,简单的方式是通过三层遍历,但是可以考虑两层遍历,固定第一个位置,然后采用双指针的方式,找到距离目标最小的组合。
问题:
1、距离最小的中间遍历设置;
附上C++代码1:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int length=nums.size();
int re=nums[0]+nums[1]+nums[2];
int ans=nums[0]+nums[1]+nums[2]-target;
for(int i=0;i<length;i++)
for(int j=i+1;j<length;j++)
for(int k=j+1;k<length;k++)
{
int s=nums[i]+nums[j]+nums[k];
if(abs(s-target)<abs(ans))
{
re=s;
ans=s-target;
}
}
return re;
}
};
附上C++代码2:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int length=nums.size();
int gap_min=INT_MIN,gap_max=INT_MAX;
sort(nums.begin(),nums.end());
for(int i=0;i<length-2;i++)
{
int j=i+1;
int k=length-1;
while(j<k)
{
int ans=nums[i]+nums[j]+nums[k]-target;
if(ans==0)
return target;
else if(ans>0)
{
k--;
gap_max=min(gap_max,ans);
}
else
{
j++;
gap_min=max(gap_min,ans);
}
}
}
if(gap_max+gap_min<0)
return target+gap_max;
else
return target+gap_min;
}
};
附上Python代码:
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
ans=sum(nums[:3])
for i in range(len(nums)):
j=i+1
k=len(nums)-1
while j<k:
s=nums[i]+nums[j]+nums[k]
if abs(s-target)<abs(ans-target):
ans=s
elif s<target:
j+=1
else:
k-=1
return ans