我是编程新手,并试图通过探索来学习。我正在寻找一种解决方案,以找到具有最佳空间复杂度的数组中的最大时间重复整数之和。假设我们[1,2,3,3]结果应该是6,空间复杂度最小,比如说O(n)。
我提出了一个解决方案但不确定复杂性。需要一些帮助来理解下面提到的代码是否具有最小的复杂性,或者它可能更好(绝对是!)。对不起,如果我犯了任何错误并提前致谢。
public static int maxDuplicateSumSpaceBased(int[] a)
{
int maxRepCount = 1, tempCount;
int maxRepNum = a[0];
int temp = 0;
for (int i = 0; i < (a.length - 1); i++)
{
temp = a[i];
tempCount = 0;
for (int j = 1; j < a.length; j++)
{
if (temp == a[j])
tempCount++;
}
if (tempCount > maxRepCount)
{
maxRepNum = temp;
maxRepCount = tempCount;
}
}
return maxRepNum * maxRepCount;
}
答案 0 :(得分:1)
实际上,输入的空间通常不计入O表示法,因此您的程序的空间复杂度为O(6)= O(c)= O(1)。 c是常数。实际上你总是使用6个变量。如果使用的空间量取决于给定的输入情况不同,但不是你的情况,因为无论你输入的长度如何,你总是使用6个变量。
如果你想把输入计算为占用空间(有时已经完成)你的空间复杂度将是O(6 + n)= O(n),假设n是输入的长度。
不可能做得更好,因为你可以轻松证明: 您输入的内存不会少(或者您必须记住所有输入)。由于输入是唯一不是常量的东西,因此使用的最大空间是存储n的输入所需的空间。
答案 1 :(得分:1)
解决方案的空间复杂度 1 为O(1)
。你不可能做得更好。
您的解决方案的时间复杂度为O(N^2)
。您可以通过以下几种方式改进:
如果您可以修改a
,则可以对其进行排序{时间O(NlogN)
,空格O(1)
}然后查找/计算最常见的值{O(N)
,O(1)
}。总体复杂度为{O(NlogN)
,O(1)
}。
如果您无法修改a
,请将其{O(N)
/ O(N)
}复制,然后按上述步骤操作。总体复杂度为{O(NlogN)
,O(N)
}。
如果数字(M)的范围小于数字的数量,则可以使用存储桶排序。总体复杂度为{O(N)
,O(M)
}。
使用HashMap可以获得更好的时间复杂度。其总体复杂度平均为{O(N)
,O(N)
} ...具有明显更大的比例常数。 (不幸的是,最坏的情况时间复杂度将是O(NlogN)
或O(N^2)
,具体取决于哈希映射实现。它发生在所有键冲突时。Integer
密钥和{{ 1}},但HashMap
键可能。)
1 - 我指的是另外到输入数组占用的空间。显然,用于输入数组的空间无法优化。这是给定的。
答案 2 :(得分:0)
我理解你的问题..现在可能有一个解决方案,有n个整数和所有整数k [1-n]。然后找到maxrepeatnumber需要O(n)时间。
public static int maxDuplicateSumSpaceBased(int[] a)
{
int maxRepCount = 1, tempCount;
int k=a.length();
for (int i = 0; i <k; i++)
{
a[a[i]%k]+=k;
}
int maxRepnumber=0,temp=a[0];
for (int j = 1; j < k; j++)
{
if (temp < a[j])
{
temp=a[j];
maxRepnumber=j;
}
}
}
return maxRepNum;
}
Then you sum all that number and it take O(n)and O(1) space.