找到最接近给定数字的三个数字

时间:2018-03-31 16:23:58

标签: python algorithm sorting search data-structures

我正在尝试解决问题,

  

给定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

无法理解为什么会失败以及如何使我的逻辑保持一致。

感谢您的帮助。

4 个答案:

答案 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