如何检查均匀间隔的最大元素数?

时间:2016-04-22 16:47:03

标签: java arrays optimization

我有一个数组,我的目标是找出有多少是11的倍数。数组没有排序。

Such as [27, 16, 52, 84], this would return 2
        [1, 55, 66, 33] should return 3.
        [99, 8, 52, 32] should return 0

目前我所拥有的是基本上遍历数组中的每个元素,检查每个其他元素乘以11.但这使我处于O(n²)运行时,无论如何我可以优化它?

 static int eval(int [] a) {
       int i, j, k, counter = 0;
       for (i = 0; i < a.length; i++) {
            for (j = 0; j < a.length; j++) {
                if (i != j) {
                   for (k = -9; k < 10; k++) {
                        if (a[i] == a[j] + k*11) {
                            counter++;
                            break;
                        }
                   }
                }
            }
       }
     //if found nothing, will return 0, if found 1 matching, 
     //it should be 2 numbers that share this 11-difference. 
    return counter : counter == 0? 0: counter + 1;
 }

谢谢!

2 个答案:

答案 0 :(得分:1)

您需要2个循环来完成此任务。计算每个元素之间的差异,如果该数字是11的倍数,则递增计数器。返回计数器的一半,就像你在两个元素之间达到11的倍数一样,你最终会在循环中再次击中相同的两个元素:

<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>

答案 1 :(得分:1)

并不完全清楚输出应该是什么,例如[11, 22, 34, 45]。我将问题解释为要求输入的最大子集的大小,其中子集的元素之间的所有差异是11的倍数,并且大小-1子集不计数。

具有相同残差mod 11的所有输入间隔为11的倍数,因此我们只需要计算输入中有多少个int具有i % 11的每个可能值。这需要时间线性的输入大小。

static int eval(int[] a) {
    int[] inputsPerResidue = new int[11];
    for (int i : a) {
        inputsPerResidue[i % 11]++;
    }
    int maxGroupSize = 0;
    for (int groupSize : inputsPerResidue) {
        if (groupSize > 1 && groupSize > maxGroupSize) {
            maxGroupSize = groupSize;
        }
    }
    return maxGroupSize;
}