我希望在Java ArrayList中找到重复的对的数量。
我可以在纸上解决这个问题,但我不知道是否有某种形式的数学公式可以轻松解决这个问题,因为我试图在代码中避免使用嵌套for循环。
使用数据集[2,2,3,2,2]的示例: 0:1,0:3,0:4,1:3,1:4,3:4。所以答案是六对重复?
答案 0 :(得分:4)
你只需要计算每个数字出现的次数(我会在这里使用地图)并计算每个数字的计数的2个组合(http://en.wikipedia.org/wiki/Combination),并且计数> 1。
所以基本上你需要一种方法来计算n!/k!(n-k)!
,k
为2,n
为计数。
以你的例子[2,2,3,2,2]为例,数字2出现了4次,所以算数将会出现:
4!/ 2!(4-2)! = 24/4 = 6 - > 6对
如果您不想实现阶乘函数,可以使用Apache Commons的ArithmeticUtils,它们已经有factorial implemented。
答案 1 :(得分:2)
如果你想避免嵌套循环(以2个循环为代价),你可以:
像ElKamina这样做的建议可以对这种方法进行一些优化。
答案 2 :(得分:0)
先排序数字。之后,如果存在给定数字的k
个副本,则该数字将有k*(k-1)/2
个对。现在总结所有数字。
答案 3 :(得分:0)