【问题标题】:Time complexity question asked in interview面试时问的时间复杂度问题
【发布时间】:2019-12-03 19:01:18
【问题描述】:
int[] a = {3,5,4,3,2,2,1};

        System.out.println("Duplicate elements are: ");

        for(int i=0; i<a.length; i++) {
            for(int j = i+1; j<a.length; j++) {
                if(a[i]==a[j]  && i!=j){
                    System.out.println(a[j] + " ");
                }
            }
        }

这段代码时间复杂度是O(n^2),面试官让我把它改成O(n)。我们该怎么做?

【问题讨论】:

  • 这里应该做什么://do something in constant time?两个循环都从zero 增加到n。为什么你甚至需要内循环?
  • 在不知道嵌套循环内的内容的情况下是不可能做到的。最后可能变成 O(1),可能是 O(n),也可能是 O(n²)。
  • 好吧,如果某事是例如用值填充矩阵,例如m[i][j] = i*j,那么这是不可能的
  • 我已经更新了我的问题中的代码。这是完全相同的问题。您现在能详细说明一下吗?
  • @RyanWilson 现在检查代码的更新版本。你现在能告诉我我们该怎么做吗?

标签: java algorithm loops data-structures time-complexity


【解决方案1】:

这是一种满足O(n) 要求的解决方案,即使用HashSet - HashSet 不会接受重复值,因此您只需要一个循环,即如果满足要求允许使用声明的HashSet:

int[] a = {3,5,4,3,2,2,1};
// Create a set 
Set<Integer> set = new HashSet<Integer>();
//Create a set for storing duplicates
Set<Integer> setDupes = new HashSet<Integer>();

System.out.println("Duplicate elements are: ");

//loop the array once 
for (int num : a) 
{ 
     if (set.add(num) == false) 
     { 
        // your duplicate element
        if(setDupes.add(num) == true) 
           System.out.println(num + " ");
     } 
}

【讨论】:

  • 又看了一遍问题,我觉得你说得对。 OP并不具体,我做了一些错误的假设。我已经删除了我的 cmets。
  • @JimMischel 没问题,吉姆。我认为你只是想帮助和教我一些东西。对于那件事我没有任何疑问。老实说,我在空闲时间休息了大约 2 天,试图想出一个更好的解决方案,但不幸的是我无法做到。
【解决方案2】:

这取决于你想在循环内做什么。如果它们不依赖,那么您可以将它们合并为一个

【讨论】:

  • 现在检查代码的更新版本。你现在能告诉我我们该怎么做吗?
【解决方案3】:

当循环不依赖时,您可以将循环重写为:

    for (int i = 0, j=0; i < n && j<n; i++;j++) {
        //do something in constant time
    }

【讨论】:

  • 我们不知道循环是独立的。如果恒定时间的东西类似于 intArray[i][j] = 0; 怎么办?
  • @azurefrog 我有时想知道这样的帖子是否是故意尝试将声誉从一个帐户添加到另一个帐户或通过同一用户添加到两个帐户的。
  • @RyanWilson 闻起来像锡纸
  • @CoderinoJavarino 它闻起来有点……:P 特别是因为 OP 似乎没有响应,也没有发布答案的人。
  • 现在检查代码的更新版本。你现在能告诉我我们该怎么做吗?
猜你喜欢
  • 2023-03-30
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多