ここでは最大値の1つだけを削除するコードです最初のものですが、これは無関係です)。時間的にはO(n)
であり、入力の範囲を超えているのはO(n)
です。 O(N)時間とO(C)空間の複雑さでJava 8ストリームAPIを使用してリストからmax(min)を1つだけ削除する方法
public List<Integer> removeOneOfTheMax(List<Integer> nums) {
int max = Integer.MIN_VALUE;
int maxIndex = -1;
Iterator<Integer> it = nums.iterator();
for (int i = 0; it.hasNext(); i++) {
Integer temp = it.next();
if (max < temp) {
maxIndex = i;
max = temp;
}
}
nums.remove(maxIndex);
return nums;
}
1.
は何のJava 8ストリームAPIを用いた方法と同等のでしょうか?私は時間と空間の複雑さを保ちたいので、並べ替えはできません。あなたは上記のコードにLinkedList
を渡す場合
2.実際には、スペースの複雑さは、(入力を越えて再び、)O(C)
だろうが、私の知る限り理解し.stream()
は、追加のデータ構造にそのストリームAPIを作成しますスペースは少なくともO(N)
でなければなりません。私が間違っているなら、私を訂正してください。
なぜこれが「宇宙のO(n)」だと思いますか?既に存在する 'List'はカウントされないので、リストサイズに比例したメモリ要件はありません。 'ArrayList'か' LinkedList'のどちらを使っているかにかかわらず、これはスペース上の 'O(1)'です。これは 'CopyOnWriteArrayList'を使うときは違うでしょうが、アルゴリズムの責任ではありません。 – Holger
最悪の場合、ArrayListから要素を削除するには、新しい配列を作成し、すべての要素をその要素に再コピーする必要があります。これはLinkedListの場合には発生しません。 – GA1
'ArrayList.remove(int)' [それは決してありません](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/ArrayList.java #491)。あなたは 'add 'と混同しているかもしれません。しかし、それが高価だったとしても、あなたのアルゴリズムの特性ではありませんでした。 – Holger