【问题标题】:Closest Sums of 2 groups in javajava中2组的最接近总和
【发布时间】:2020-12-29 04:31:33
【问题描述】:

我在解决这个问题时遇到了一些问题:

给定一个ints 的数组,将输入分成两组,使它们的和尽可能接近,两组长度必须相等,或者如果输入是奇数长度,则一组可以有 1比另一个多。然后先打印较小的和,然后打印较高的和。

例如: 输入 -> [4,6,17,3,2,5,10] 输出 -> 23,24 ([17,5,2] , [10,6,4,3])

这是我想出的,到目前为止我测试过的都通过了,但我不知道它是否真的正确:

public static String closestSums(int[] input) {
    Integer sum1 = 0;
    Integer sum2 = 0;
    Integer dif = 0;
    Integer bigSum = 0;

    List<Integer> list = new ArrayList<>();
    List<Integer> list1 = new ArrayList<>();
    List<Integer> list2 = new ArrayList<>();

    for (int x = 0; x < input.length; x++) {
        list.add(input[x]);
    }

    Collections.sort(list);

    for (int x = list.size(); x >= 0; x--) {
        bigSum += list.get(x);
        if (dif == 0) {
            dif = list.get(x);
            list2.add(list.get(x));
        }
        else if (dif > 0) {
            dif -= list.get(x);
            list1.add(list.get(x));
        }
        else {
            dif += list.get(x);
            list2.add(list.get(x));
        }
    }

    dif = Math.abs(dif);
    if (dif != 0) {
        sum2 = (bigSum / 2) + dif;
        sum1 = bigSum / 2;
    }
    else {
        sum2 = bigSum / 2;
        sum1 = bigSum / 2;
    }
    return sum1 + ", " + sum2;
}

【问题讨论】:

  • 向我们展示您的努力,以便我们为您提供帮助
  • 发布我的答案,但必须全部输入,所以需要一两分钟
  • 已发布,希望对您有所帮助
  • 到目前为止我已经测试过,但我不知道它是否真的正确 如果它通过了所有测试,为什么它不正确?您是否测试了不同的输入数组?您是否测试了一个只有两个元素的输入数组?您是否测试了包含偶数个元素和奇数个元素的输入数组?
  • 请参阅stackoverflow.com/a/65314921/585411 以获得更好的方法。

标签: java algorithm


【解决方案1】:

这是不正确的。

不管其他答案中提到的一堆小编码错误,您的算法都不起作用。

考虑输入[3, 3, 2, 2, 2]。您的算法会将其分为[3, 2, 2][3, 2],两者相差7-5=2。但是,存在更好的等和拆分:[3, 3][2, 2, 2]

我不打算提供一个完整的算法,但给你一些提示:

1 - 可以对最小差异进行二进制搜索。如果你能想出一个算法来决定是否可以拆分数组,使得对于给定的d,各部分的总和之差最多为d,那么你可以二进制搜索最小@987654330算法输出1的@。

2 - 查看subset sum problem,它可以帮助解决我在第 1 项中定义的子问题。

【讨论】:

  • 如果你能找到一个可行的解决方案,Venmo 你现在只需 10 美元
【解决方案2】:

在分析和运行您的代码后,我做了 3 次观察。

  1. 整个代码有很多小错误。

    • 语法错误在第 4 行('Dif' 的初始化)第 11 行('for' 关键字)
    • 逻辑错误在第 26 行,第 27 行(而不是访问索引“i”,您必须访问索引“x”)
    • 运行时错误在第 17 行(初始化 x=list.size() 将引发运行时错误 java.lang.IndexOutOfBoundsException

    不过,下面提到了要注意的重要事项

  2. 这是一个建议,如果您没有打印带有“sum1”和“sum2”的列表,那么创建和操作另外两个输出列表是多余的。遍历主列表时可以计算列表的各个总和。

  3. 最重要的是,您在遍历列表然后划分它们之后计算 sum1 和 sum2 的方式是不可靠的。 例如。以下输入将给出意外输出[4,6,45,3,2,5,10]。因此,我建议您采用最可靠的方法来计算列表 1 和列表 2 的总和,即在遍历列表时计算它们。 (也可以去掉bigSum的全部逻辑)

遗言:自己尝试并实施上述想法。

【讨论】:

    猜你喜欢
    • 2016-10-10
    • 2012-06-28
    • 1970-01-01
    • 2015-01-13
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多