【问题标题】:Find sum of max repeating integer in array with least time complexity查找时间复杂度最小的数组中最大重复整数的总和
【发布时间】:2015-11-08 05:49:24
【问题描述】:

我是编程新手,并试图通过探索来学习。我正在寻找一种解决方案,以在具有最佳时间复杂度的数组中找到最大时间重复整数的总和。 假设我们有 [1, 2, 3, 3],结果应该是 6,时间复杂度最低,比如 O(n)。

我想出了一个解决方案,但不确定其复杂性。需要一些帮助来了解下面提到的代码是否具有最低的复杂性或者它可能会更好(绝对!)。对不起,如果我犯了任何错误并提前感谢。

public static int mapBasedFinder(int[] arr){
    Map<Integer, Integer> values = new HashMap<Integer, Integer>();
    int result = 0;
    for(int i=0; i<arr.length; i++){
        int temp = arr[i];
        if(values.containsKey(temp))
            values.put(temp, values.get(temp)+1);
        else
            values.put(temp, 1);

        Map.Entry<Integer, Integer> maxEntry = null;
        for (Map.Entry<Integer, Integer> entry : values.entrySet())
        {
            int key = entry.getKey();
            if (maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0)
            {
                maxEntry = entry;
                result = entry.getValue() * key;
            }
        }
    }
    return result;
}

【问题讨论】:

  • 在第一个 for 循环中包含第二个 for 循环似乎是错误的。您的第一个循环(填充地图)应该在第二个循环扫描地图之前完成。

标签: java arrays algorithm performance


【解决方案1】:

你有两个循环,第二个循环第一个循环内。这会给你带来比 O(n) 更糟糕的复杂性 - 可能是 O(n2) (最坏的情况)。

但这似乎是一个错误。您应该将第二个循环移到第一个循环之外,因为您只需要在完全遍历数组一次后检查最大值即可找出每个数字重复的次数。

然后你的复杂度又回到了 O(n),因为没有 O(2n) 这样的东西 - 对值进行两次迭代仍然是 O(n)。

【讨论】:

  • 如果我们想最小化空间复杂度,无论时间复杂度是多少(假设时间复杂度不再是问题),空间复杂度的最佳情况是什么?
【解决方案2】:

维护 2 个变量 maxRepCountmaxRepNum 并跟踪这两个变量。不是在读取所有元素后进行处理,而是在循环中使用它。

int []a = {1,2,3,3};
int maxRepCount = -1;
int maxRepNum = a[0];
HashMap<Integer, Integer> hm = new HashMap();

for(int i = 0; i < a.length; ++i)
{
 int count;
 if(hm.containsKey(a[i]))
 {
  count = hm.get(a[i]) + 1;
  hm.put(a[i], count);
 }
 else
 {
  hm.put(a[i], 1);
  count = 1;
 }
 if(count > maxRepCount)
  { 
    maxRepCount = count;
    maxRepNum = a[i];
  }
}
System.out.println(maxRepNum * maxRepCount);

【讨论】:

  • 是的。时间复杂度O(N),空间复杂度O(N)
  • 谢谢,我现在可以更好地理解它了。如果我们想最小化空间复杂度,无论时间复杂度是多少(假设时间复杂度不再是问题),空间复杂度的最佳情况是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
相关资源
最近更新 更多