有n个整数a1,a2,...,an的序列。我们需要用最小的元素来改变序列中的每个元素,它们放在它之前。如果没有这样的元素,我们需要用-1代替它。所有的变化都是同步的和独立的。列表操作算法太慢
例子:
4 3 1 2 1 - > -1 4 3 3 2
5 4 3 2 1 - > -1 5 4 3 2
我的代码是太慢和序列太大时,不会通过测试,并显示超时错误。我怎样才能提高其表现?
这里是我的代码:
public static void main(String[] args) throws InterruptedException {
ArrayList<Integer> list = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
int nElements = scanner.nextInt();
for (int i = 0; i < nElements; i++) {
list.add(scanner.nextInt());
}
ArrayList<Integer> newList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
int tmp = -1;
for (int j = i - 1; j >= 0; j--) {
if (list.get(i) < list.get(j)) {
if (list.get(j) < tmp || tmp == -1) {
tmp = list.get(j);
}
}
}
newList.add(tmp);
}
list = newList;
}
更新:我忘了提,新的价值应该比我们改变元素更大。
究竟是什么要求?我没有得到这些例子。请注意,您可以通过对最终大小进行良好估计来加速ArrayList。你在构造函数中将它作为'initialCapacity'来告诉它。 – Zabuza
不应该是'4 3 1 2 1 - > -1 4 3 1 1'? – janos
你不应该需要内部循环。元素i之前的最小元素是(元素i-1之前的最小值)和(元素i-1)的最小值。你只需一次就可以完成。 –