【发布时间】:2017-09-26 12:02:08
【问题描述】:
一个让我猜测的问题如下:
假设我们有一个带有数字 {1,1,1,1,2,2,4,4,4} 的排序数组。
现在,鉴于我们可以清楚地看到我们有六对 1、一对 2 和三对 4(10 对)。你将如何构建一个在 O(n) 中找到这些对的算法?
我有一个算法可以计算数组中的对,这样做是这样的:
Arrays.sort(array);
int counter = 0;
for(int i = 0; i<array.length; i++) {
for(int j = i+1; j<array.length; j++) {
if(j!=i && array[j] == array[i]) {
counter++;
}
}
}
return counter;
但这在 O(N^2) 中运行,我猜(我是算法的新手)有一个更好的解决方案可以仅使用一个 for 循环或多个 while 循环来获得相同的结果?
我想听听你的想法!
【问题讨论】:
-
“清楚地看到我们在 1 上有六对”
-
您提到的
6对1是指4 choose 2 = 6吗?怎么有2对2?请详细说明。 -
很明显你说...
-
澄清一下 - 假设我们有 ABCD。那么字符的不同组合就是AB、AC、AD、BC、BD、CD。现在,如果你对 1 做同样的事情 - 你会明白我的意思 :)
-
请注意,原始帖子与帖子的当前编辑版本略有不同。对于“六对一”,OP 确实意味着
n choose 2。现在改为“出现数字”,但这会稍微改变问题。
标签: java arrays algorithm sorting