如何查找某个数组元素左侧的元素数量多于它?

时间:2018-03-27 00:26:46

标签: java arrays optimization

给定一个数组,我想弄清楚哪个元素 x 左边的数字大于 x 。例如,在阵列[3,3,1,8,2,9]中,元素2在其左侧具有 3 的数字,其大于其自身。

这个问题的答案应该是值左边更大数字的数量。这是我明显的蛮力解决方案:

    int biggest = 0;
    for (int i = 0; i < n; i++) {
        int num = 0;
        for (int j = 0; j < i; j++)
            if (a[j] > a[i])
                num++;
        biggest = Math.max(biggest, num);
    }

然而,这在O(n ^ 2)时间内运行,这是不希望的。我怎样才能更快地解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果size tailSet TreeSet的{​​{1}}有效实施,那么此类内容就可行。但AFAIK可能是O(n)而不是O(log(n))

int biggest = 0;
TreeSet<Integer> set = new TreeSet<>();
for (int x : a) {
    int num = set.tailSet(x).size();
    biggest = Math.max(biggest, num);
    set.add(x);
}

所以这只是想法。如果您实现了自己的TreeSet,那么它将起作用,其中每个节点都会记住其右子的大小。插入仍为O(log(n)),大小计算也为O(log(n)),整个循环为O(n * log(n))

这肯定是可行的,只是做了一些工作。