java - 如何查找某个数组元素左侧有多少个元素大于该元素?

标签 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) 时间内运行,这是不希望的。我怎样才能更快地解决这个任务?

最佳答案

如果 TreeSettailSet 有一个有效的 size 实现,这样的事情就会起作用。但据我所知,它是 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))

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

关于java - 如何查找某个数组元素左侧有多少个元素大于该元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49502623/

相关文章:

java - 为什么首先对较小的子数组进行排序会导致更快的快速排序?

java - JTable 中的动画

python - 为什么 ByteArray() 组合数组值? (Python)

java - Jenkins Build 因 SVNException 而失败

php - 将数组转换为数组php中的键和值

arrays - 如何将函数应用于数组并形成两个单独的数组?

c - 是否可以用 C 编写零成本的异常处理?

php - MySQL fulltext/regexp/levenshtein 搜索优化

java - Playframework 临时表单验证已执行,但未按预期工作

java - 与 Oracle Internet Directory 的连接池