【问题标题】:Is this possible to generate subarray in O(n) time?这有可能在 O(n) 时间内生成子数组吗?
【发布时间】:2018-09-08 10:37:51
【问题描述】:

我正在尝试借助以下代码生成子数组,但此代码的时间复杂度为 O(n^3)。请帮我找出最佳的方法。

我的代码如下:

 static ArrayList<ArrayList<Integer>> solve(List<Integer> a) {
  ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>(); 

    for(int i=0;i<a.size();i++)
    {
        for(int j=i;j<a.size();j++)
        {
           ArrayList<Integer> temp=new ArrayList<Integer>();  
           for(int k=i+1;k<=j;k++)
               {
                    temp.add(a.get(k));

               }

           res.add(temp)

        }

    }
    return res;
}

【问题讨论】:

  • 我正在尝试生成子数组基于什么?
  • 如果您必须生成所有可能的子数组,除了O(n^3) 之外,没有更好的方法可以做到这一点。但我认为你的目标是解决另一个问题,对吧?
  • 是的,我的目标是找到总和小于 5 的所有子数组。
  • 但我想看看数组的最佳方式。如果在 O(n) 中无法生成子数组,那么我得到了答案。
  • 也许您可以将问题编辑为“这在 O(n) 中是否可行?”或者?此外,一些示例输入和输出可能会稍微澄清这个问题(指“查找总和小于 5 的所有子数组”)。

标签: java arrays arraylist data-structures time-complexity


【解决方案1】:

如果您不需要列表独立于原始列表a,您可以使用ListsubList 方法。 https://docs.oracle.com/javase/7/docs/api/java/util/List.html

这会将复杂度降低到O(n^2)

【讨论】:

  • o(n)有什么办法吗?
  • 不,即使假设列表中的所有条目都是非负数,这是不可能的。对于每个n,您可以构造一个输入列表a,它产生O(n²)许多总和小于5的子集:对于奇数nn = 2*m + 1,否则让a[m] = 4a[m] = 0。然后(i, j)i ≤ mm ≤ j 的所有组合产生有效的子列表(开始索引i 和结束索引j)。显然,这给了你大约。 m² ~ (n/2)² 解决方案。
  • 如果所有条目都大于 0(至少 1),那么每个生成的子数组最多有 4 个条目。可能的结果(省略空结果)最多为(1+2+3+4)*n many。只需迭代起始索引i 并在内部循环中将结束索引ji+1 迭代到i+4 并创建一个subList(i, j+1)。这显然是O(4*n) = O(n)
  • 当然,在我提到的最后一个算法中,如果总和小于 5,则只需创建子列表。如果您已经知道子数组的总和过高,则可以通过跳过较大的数组来优化。
  • 好的,我知道了。谢谢。
猜你喜欢
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多