如何在O(N)时间和O(C)空间复杂度中使用Java 8流API从列表中仅删除一个max(min)

这是一个代码,用于从列表中仅删除其中一个最大值(在这种情况下是第一个,但这是无关紧要的)。 时间为O(n) ,空间为O(n) (超出输入)。

 public List removeOneOfTheMax(List nums) { int max = Integer.MIN_VALUE; int maxIndex = -1; Iterator 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); 

在下面会有一个Spliterrator。

流操作本身不会创建其他数据结构。