我需要编写一个函数,它接受List[Int]
,起始索引和结束索引,并返回该范围内的max元素。我有一个有效的递归解决方案,但我想知道是否可以使用Scala集合库中的内置函数来实现它。
其他标准是:
1)O(N)运行时间 2)没有中间结构创建 3)没有可变数据结构
def sum(input:List[Int],startIndex:Int,endIndex:Int): Int = ???
答案 0 :(得分:2)
使用Scala的观点很容易实现这一点:
def subListMax[A](list: List[A], start: Int, end: Int)(implicit cmp: Ordering[A]): A =
list.view(start, end).max
view
不会创建中间数据结构,它只提供原始切片的切片。请参阅Scala集合库文档中的Views chapter。
答案 1 :(得分:0)
我认为你的标准是不可能的。
我没有更高级的函数,它可以在列表的子列表中运行。许多人只是创建中间集合。
这将是一个简单的O(n)
解决方案,但它会创建一个中间结构。
input.slice(startIndex, endIndex + 1).max
当然还有函数,它遍历集合并产生值。示例包括reduce
和foldLeft
。问题在于它们遍历整个集合,您无法设置开始或结束。
您可以从startIndex
迭代到endIndex
并在其上使用foldLeft
通过索引获取值。一个例子是:
(startIndex to endIndex).foldLeft(Integer.MIN_VALUE)((curmax, i) => input(i).max(curmax))
这里我们只有一个迭代器,它基本上表现得像for-loop
并且不会产生繁重的中间集合。但是,从startIndex
到endIndex
的迭代为O(n)
,并且在每次迭代时,我们都有一个索引操作(input(i)
),O(n)
通常List
}。最后,sum
不会是O(n)
。
这当然只是我对scala的经历,也许我被误导了。
啊,你的3):我不确定你的意思。在函数内使用可变状态应该不是问题,因为它只存在于计算结果然后消失。