给定一个数组,我想弄清楚哪个元素 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)时间内运行,这是不希望的。我怎样才能更快地解决这个问题?
答案 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))
。
这肯定是可行的,只是做了一些工作。