我认为我做对了,可以在O(n)中找到模式。但是在计时时,它似乎更接近O(n * log(n)):
public int mode(List<Integer> numList) {
//Holds frequencies
int[] frequencies = new int[Collections.max(numList)+1];
for(int i=0; i<numList.size(); i++) {
frequencies[numList.get(i)]+=1;
}
//Convert to List
List<Integer> freqArray = IntStream.of(frequencies).boxed().collect(Collectors.toCollection(ArrayList::new));
int maxFreq = Collections.max(freqArray);
int mode = freqArray.indexOf(maxFreq);
return mode;
}
我要去哪里错了?谢谢
答案 0 :(得分:1)
您几乎是对的,因为大多数操作最多需要O(n)时间,除了流操作之外。即使遍历长度为n的Iterable
,它们也可能比O(n)花费更多的时间。更多here。
答案 1 :(得分:0)
就像指定的@Andronicus一样,您可以摆脱流并使用纯数组,甚至不使用列表。但是,再次使用您的方法,您的时间复杂度不是O(n)
,而是O(m)
,其中m
是数组中的最大元素。就像评论中提到的那样,您的方法对负值也无效。在这种情况下,HashMap
是您的最佳选择,并且在大多数情况下,可以保证O(1)
插入/获取用于计算整数等简单类型的哈希值。