【问题标题】:How can I create dynamic nested loops in java?如何在 java 中创建动态嵌套循环?
【发布时间】:2019-06-14 06:49:47
【问题描述】:

我正在尝试使用 for loop 以动态方式添加所有组合的数组列表值。例如,在数组中添加两个元素组合可以通过嵌套循环来完成。类似地,3、4、5、6、7、8 之类的组合加法需要动态循环生成。我能做什么?

static int birthday(List<Integer> s, int d, int m) {

    int l=s.size();
    int count=0;
    int a[]=new int[l];
    for (int x=0; x<l; x++){
        a[x]=s.get(x);
    }
    if(m==2){
        for (int i=0; i<l; i++){
            for (int j=i+1; i<l; i++){
                if(a[i]+a[j]==d){
                    count++;
                }
            }
        }
    }
    else if(m==1){
        count++;
    }
    return count;
}

以上代码适用于 1 和 2 组合以及所有 3,4,...10。我想生成动态for loop。请给出解决方案。

【问题讨论】:

  • 考虑另一种方法。动态嵌套循环会减慢您的代码速度。想想动态创建的 300 个嵌套循环。您的代码复杂度为O(n^300)
  • 您可以使用数学计算来解决这个问题。但是,如果您必须需要动态循环,请尝试递归。

标签: java nested-loops


【解决方案1】:

你可以使用递归:

static int birthday(List<Integer> s, int d, int m) {
    int l=s.size();
    int a[]=new int[l];
    for (int x=0; x<l; x++){
        a[x]=s.get(x);
    }
    return birthday(a, d, m, 0, 0);
}

private static int birthday(int[] a, int d, int m, int start, int sum) {
    if (m == 0) {
        return sum == d ? 1 : 0;
    }
    int count=0;
    for (int i = start; i <= a.length-m; ++i) {
        count += birthday(a, d, m-1, i+1, sum+a[i]);
    }
    return count;
}

如果您对数组进行排序并且可以假设列表的所有元素都是正数,则可以进行一些优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    相关资源
    最近更新 更多