问题描述:我在我的算法分配中发现了这个问题。 它想让我找到O(n)时间和O(1)空间中数组所有元素的频率。
Array可以像 Ar [] = {1,6,3,78,4,6,1}
经过一番思考后,我想到了这种方法:
我对步骤2有疑问。 在步骤1中找到最大元素(例如m)后,我将制作一个新的大小为m的数组。 事物数组占用O(1)空间吗?如果没有,请解释
答案 0 :(得分:1)
是的,您正确地找到了最大数目,然后创建该长度的哈希数组不是O(1)空间复杂度的解决方案,因为O(1)空间复杂度指的是恒定的空间使用率,但是如果您声明仅根据您的输入值确定数组的大小,然后空间如何才能为常数。 恒定空间或O(1)复杂度意味着不考虑输入值而是独立于输入的方法。 因此,您的方法不适用于该解决方案。 希望,我已经说清楚了。 但是,如果您想解决问题,可以在这里找到 Geeks for Geeks 它很好地说明了您的问题。
答案 1 :(得分:1)
没有任何关于您输入的假设,就无法在O(n)
时间和O(1)
空间内做到这一点
O(1)
个空间意味着您可以预先确定要分配的空间量。意味着它是常量(因此不依赖于您的基本数组)char
数组时,可以将空间固定为128个integers
的数组。然后,您遍历输入并递增arr[charCode(currentChar)]
positive intergers
。您可以创建一个Integer.MAX_VALUE
大小为2^32 - 1
的整数数组。然后应用与之前相同的逻辑。答案 2 :(得分:1)
我认为在O(1)空间和O(n)时间中执行此操作将很困难,除非您可以做出一些假设,如其他一些答案所建议的那样。我认为分配长度为MAXINT的数组确实不是正确的选择。
在O(唯一值数量)空间和O(n)中的答案要容易得多。使用哈希,其中键是数组中的值,哈希值是计数。您将对数据进行一次遍历,然后您将获得一个具有完整计数的哈希。
HashMap<Integer,Integer> map.= new HashMap<Integer,Integer>();
for (int value: array) {
Integer valueI = new Integer(value);
if (!map.hasKey(valueI)) {
Integer count = new Integer(1);
map.put(valueI, count);
}
else {
Integer oldCount = map.get(valueI);
Integer newCount = new Integer(oldCount.intValue() + 1);
map.put(valueI, count);
}
}
类似的东西。地图的键包含唯一的值,以及每个计数的键映射的值。
在没有对数据做大量假设或分配一个非常大的数组的情况下,我无法想出在O(1)空间中可以做的任何事情。毕竟,您必须将结果存储在某个地方。