2017-01-27 7 views
2

ここでは最大値の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)でなければなりません。私が間違っているなら、私を訂正してください。

+2

なぜこれが「宇宙のO(n)」だと思いますか?既に存在する 'List'はカウントされないので、リストサイズに比例したメモリ要件はありません。 'ArrayList'か' LinkedList'のどちらを使っているかにかかわらず、これはスペース上の 'O(1)'です。これは 'CopyOnWriteArrayList'を使うときは違うでしょうが、アルゴリズムの責任ではありません。 – Holger

+0

最悪の場合、ArrayListから要素を削除するには、新しい配列を作成し、すべての要素をその要素に再コピーする必要があります。これはLinkedListの場合には発生しません。 – GA1

+2

'ArrayList.remove(int)' [それは決してありません](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/ArrayList.java #491)。あなたは 'add 'と混同しているかもしれません。しかし、それが高価だったとしても、あなたのアルゴリズムの特性ではありませんでした。 – Holger

答えて

3

ストリームソリューション次のようになります。

int maxIndex = IntStream.range(1, nums.size()).reduce(0, (i, j) -> { 
     int left = nums.get(i); 
     int right = nums.get(j); 
     return Integer.max(left, right) == left ? i : j; 
    }); 

    nums.remove(maxIndex); 

は、その下Spliterratorがあるように起こっています。

ストリーム操作自体は、追加のデータ構造を作成しません。

+2

通常、既存の方法を使用することをお勧めしますが、ここではコードが複雑になります。ラムダ式全体を '(i、j) - > nums.get(i)> = nums.get(j)に単純化できますか? i:j'。 – Holger

+0

これは私が探していた答えです – GA1

関連する問題