簡體   English   中英

如何在O(N)時間和O(C)空間復雜度下使用Java 8流API從列表中僅刪除一個最大值(min)

[英]How to remove only one max (min) from a list using Java 8 stream API in O(N) time and O(C) space complexity

這是一個代碼,用於從列表中僅除去一個最大值(在這種情況下為第一個,但這無關緊要)。 它是O(n)在時間和O(n)在空間(超出輸入)。

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的方法等效嗎? 我想保留時間和空間的復雜性,因此不允許排序。

2.實際上,如果將LinkedList傳遞到上述代碼中,則空間復雜度將為O(C) (同樣,超出輸入范圍),但是據我所知, .stream()創建了一個附加數據結構,因此流API等效空間至少必須為O(N) 如果我錯了,請糾正我。

流解決方案可能看起來像這樣:

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);

下方將有一個Spliterator

流操作本身不會創建其他數據結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM