我正在尝试解决问题,
给定n个整数的数组S,在S中找到三个整数,使得 sum最接近给定的数字,目标。归还三者的总和 整数。您可以假设每个输入都只有一个 溶液
For example, given array S = {-1 2 1 -4}, and target = 1. The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
我的解决方案是:从数组中取出一个数字(number_1),将目标设置为目标 - 该数字并找到最接近新目标的另外两个数字。这样:number_1 + number_2 + number_3将最接近number_2 + number_3将最接近目标 - number_1。
我在https://leetcode.com/problems/3sum-closest/description/尝试了我的解决方案。
我的解决方案是:
def threeSumClosest(nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
closest_sum = nums[0] + nums[1] + nums[2]
for i in range(len(nums)):
# Create temp array excluding a number
if i!=len(nums)-1:
temp = nums[:i] + nums[i+1:]
else:
temp = nums[:len(nums)-1]
# Sort the temp array and set new target to target - the excluded number
temp = sorted(temp)
l, r = 0, len(temp) -1
t = target - nums[i]
while(l<r):
if temp[l] + temp[r] == t:
return target
elif temp[l] + temp[r] > t:
if abs(temp[l] + temp[r] + nums[i] - target) < abs(closest_sum - target):
closest_sum = temp[l] + temp[r] + nums[i]
r = r - 1
else:
if abs(temp[l] + temp[r] + nums[i] - target) < abs(closest_sum - target):
closest_sum = temp[l] + temp[r] + nums[i]
l = l + 1
return closest_sum
它从125个中传递了80个测试用例,因此解决方案逻辑对我来说足够好了。
它失败了:
Input:
[0,2,1,-3]
1
Output:
3
Expected:
0
无法理解为什么会失败以及如何使我的逻辑保持一致。
感谢您的帮助。
答案 0 :(得分:2)
你有几个错误,第一个是愚蠢的,你在input.useDelimiter("");
while(input.hasNext())
{
// Get the next letter and convert to char
char c = input.next().charAt(0);
if (c == '(') {
R_ParCount++;
}
else if (c == ')') {
L_ParCount++;
}
else if (c == ',') {
ComCount++;
}
else if (c == '%') {
PerCount++;
}
// etc...
}
有一个额外的缩进,第二个没有检查在第3个if语句中更新return closest
。
这段代码被接受了:
closest
这是一个公认的C ++解决方案,运行时间为class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
closest = nums[0] + nums[1] + nums[2]
#if len(nums)==3:
# return closest
for i in range(len(nums)):
if i!=len(nums)-1:
temp = nums[:i] + nums[i+1:]
else:
temp = nums[:len(nums)-1]
temp = sorted(temp)
l, r = 0, len(temp) -1
t = target - nums[i]
while(l < r):
if abs(temp[l] + temp[r] + nums[i] - target) < abs(closest - target):
closest = temp[l] + temp[r] + nums[i]
if temp[l] + temp[r] == t:
return target
elif temp[l] + temp[r] > t:
r = r - 1
else:
l = l + 1
return closest
:
O(n^2)
答案 1 :(得分:1)
您可以在列表中找到所有值组合,然后找到其总和最接近目标的列表:
import itertools
s = [{'vals':[-1, 2, 1, -4], 'target':1}, {'vals':[0,2,1,-3],'target':1}]
final_result = {tuple(a['vals']):sum(min(itertools.combinations(a['vals'], 3), key=lambda x:abs(a['target']-sum(x)))) for a in s}
输出:
{(-1, 2, 1, -4): 2, (0, 2, 1, -3): 0}
答案 2 :(得分:1)
正如我们在评论中所做的那样,最后一个return
语句错误地位于for
循环中,在第一次迭代后将其缩短。
此外,closest
应在我们超出或低于目标的两个分支中更新。
我认为你的算法的一个明显改进是先排序。删除单个元素不会破坏顺序,因此您只需要排序一次。那会让你从O(n ^ 2 log n)到O(n ^ 2)。
答案 3 :(得分:0)
我的解决方案适用于此输入:
[0,2,1,-3] 1
您最近的和变量不正确。看到我的变量名为“ gap”
class Solution:
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
sorted_nums = sorted(nums)
gap = sorted_nums[len(nums)-1] * 10000
solution = 0
for pointer_1 in range(len(sorted_nums)):
pointer_2 = pointer_1 + 1
pointer_3 = len(sorted_nums) - 1
while(pointer_2 < pointer_3):
gap_n = abs((sorted_nums[pointer_1]+sorted_nums[pointer_2]+sorted_nums[pointer_3]) - target)
add = (sorted_nums[pointer_1]+sorted_nums[pointer_2]+sorted_nums[pointer_3])
if (gap_n < gap):
solution = add
gap = gap_n
elif (target > add):
pointer_2 = pointer_2 + 1
else:
pointer_3 = pointer_3 - 1
return solution