【问题标题】:ArrayList recursion not account for repeating elementsArrayList 递归不考虑重复元素
【发布时间】:2020-05-08 20:06:36
【问题描述】:

我有这段代码显示输出达到目标数,例如目标 =1590,但它似乎没有考虑到达到目标数的 3 倍数

import java.util.ArrayList;
import java.util.Arrays;

class SumSet {
    static void sum_up_recursive(ArrayList<Integer> numbers, int target, ArrayList<Integer> partial) {
       int s = 0;
       for (int x: partial) s += x;
       if (s == target)
            System.out.println("sum("+Arrays.toString(partial.toArray())+")="+target);
       if (s >= target)
            return;
       for(int i=0;i<numbers.size();i++) {
             ArrayList<Integer> remaining = new ArrayList<Integer>();
             int n = numbers.get(i);
             for (int j=i+1; j<numbers.size();j++) remaining.add(numbers.get(j));
             ArrayList<Integer> partial_rec = new ArrayList<Integer>(partial);
             partial_rec.add(n);
             sum_up_recursive(remaining,target,partial_rec);
       }
    }
    static void sum_up(ArrayList<Integer> numbers, int target) {
        sum_up_recursive(numbers,target,new ArrayList<Integer>());
    }
    public static void main(String args[]) {
        Integer[] numbers = {431, 431, 429, 427, 424, 422, 420, 418, 416, 414, 412,
    409, 407, 405, 403, 401, 398, 396, 394, 392, 389, 409, 347, 347, 344, 344, 342, 342,
    339, 342, 344, 347, 349, 352, 354, 357, 359, 361, 364, 364, 364, 364, 431, 451, 449, 447,
    445, 443, 441, 439, 437, 435, 433, 431, 429, 427, 424, 422, 420, 418, 416, 414, 412};
        int target = 1590;
        sum_up(new ArrayList<Integer>(Arrays.asList(numbers)),target);
    }
}

对于示例输出,sum([431, 424, 396, 339])=1590 但它不考虑像这些 [424, 392, 392, 392] 和 =1590 这样的 3x 组合

我将如何重新计算元素以达到目标数量?

【问题讨论】:

  • numberstarget 修复了吗?你能假设每个有效的解决方案正好包含 4 个数字吗?还是您打算稍后再概括?
  • 欢迎来到 SO!你可以重复使用数字吗?除了迈克尔的问题之外,这里似乎还需要一个更清晰的规范。有没有理由缩小你的代码?很难按书面形式阅读。感谢您的澄清。
  • 谢谢,是的,只要达到目标数字,您就可以重复使用这些数字。只要达到目标,它的可能输出可以包含少于或多于 4 个数字。

标签: java recursion arraylist integer


【解决方案1】:

您不应该从i+1 构建remaining,因为这会排除重复项。相反,您可以从 0 开始。但是,这样您将创建必须删除重复数据的重复项。您可以按以下方式进行:

class SumSet {
  static void sum_up_recursive(List<Integer> numbers, int target, List<Integer> partial, Set<List<Integer>> resultSet) {
    int s = 0;
    for (int x: partial) {
      s += x;
    }
    if (s == target) {
      // Deduplication of results
      Collections.sort(partial);
      resultSet.add(partial);
    }
    if (s >= target) {
      return;
    }
    for (int i = 0; i < numbers.size(); i++) {
      int n = numbers.get(i);
      List<Integer> partial_rec = new ArrayList<>(partial);
      partial_rec.add(n);
      sum_up_recursive(numbers, target, partial_rec, resultSet);
    }
  }
  static void sum_up(List<Integer> numbers, int target) {
    final Set<List<Integer>> resultSet = new HashSet<>();
    sum_up_recursive(numbers, target, new ArrayList<>(), resultSet);
    for (List<Integer> result : resultSet) {
      System.out.println("sum("+Arrays.toString(result.toArray())+")="+target);
    }

  }
  public static void main(String args[]) {
    Integer[] numbers = {431, 431, 429, 427, 424, 422, 420, 418, 416, 414, 412,
        409, 407, 405, 403, 401, 398, 396, 394, 392, 389, 409, 347, 347, 344, 344, 342, 342,
        339, 342, 344, 347, 349, 352, 354, 357, 359, 361, 364, 364, 364, 364, 431, 451, 449, 447,
        445, 443, 441, 439, 437, 435, 433, 431, 429, 427, 424, 422, 420, 418, 416, 414, 412};
    int target = 1590;
    sum_up(new ArrayList<>(Arrays.asList(numbers)),target);
  }

【讨论】:

  • @ggorlen 我想使用一个多重集合(一个集合不起作用,因为你想要多次出现相同的值)但不想给番石榴引入一个新的依赖......你是的,这不是最有效的方法......
  • 我明白了——我可能没有足够仔细地研究这个问题。谢谢。
猜你喜欢
  • 2023-04-02
  • 2018-05-29
  • 2021-10-20
  • 1970-01-01
  • 2022-01-01
  • 2011-08-03
  • 1970-01-01
  • 2022-01-18
  • 2019-01-08
相关资源
最近更新 更多