我很难理解Scala数组中的循环遍历 .
我有两个数组,并希望用两个指针迭代它们 . 一个指针从第一个数组的开始开始 . 第二个指针从第二个数组的结尾开始 . 当两个指针的元素满足条件时,我想从循环中断开 . 一次,我移动任何循环的一个指针 . 有人可以帮我解决这些问题 .
I m trying to solve the problem here :http://www.geeksforgeeks.org/given-an-array-arr-find-the-maximum-j-i-such-that-arrj-arri/
给定一个数组arr [],找到最大的j - i,这样arr [j]> arr [i]
为了解决这个问题,我们需要得到两个最佳索引arr []:左索引i和右索引j .
1)对于元素arr [i],如果在arr [i]的左侧有一个小于arr [i]的元素,我们不需要考虑arr [i]左边的索引 .
2)同样,如果arr [j]右侧有一个更大的元素,那么我们不需要将这个j视为正确的索引 .
3)因此我们构造了两个辅助数组LMin []和RMax [],使得LMin [i]保持arr [i]左侧的最小元素,包括arr [i],而RMax [j]保存右边的最大元素arr [j]的一面包括arr [j] . 在构造这两个辅助数组之后,我们从左到右遍历这两个数组 .
4)当我们看到LMin [i]大于RMax [j]时,遍历LMin []和RMa []时,我们必须在LMin [](或者我)中前进,因为LMin左边的所有元素[i] ]大于或等于LMin [i] . 否则我们必须在RMax [j]中继续前进以寻找更大的j-i值 .
val list =List(34, 8, 10, 3, 2, 80, 30, 33, 1)
// Get all the minimum elements on left side for each index
val minElementWithLeftIndexes = list.zipWithIndex.foldLeft(List((list(0), 0)), (list(0), 0))((l,r) => if(l._2._1 >= r._1) (l._1 :+r, r) else (l._1:+l._2, l._2))._1.drop(1)
val maxElementWithRightIndexes = list.zipWithIndex.foldRight(List((list.last, list.length-1)), (list.last, list.length-1))((r,l) => if(l._2._1 <= r._1) (l._1 :+ r, r) else (l._1:+l._2, l._2))._1.drop(1)
println(minElementWithLeftIndexes)
println(maxElementWithRightIndexes)
//Step 4 : traverse on two lists to get the max value
Not able to do step 4 with scala.
1 回答