在数组上找到Maximun区域

时间:2018-11-16 17:36:48

标签: arrays scala performance data-structures

我正在使用Scala中的应用Data Structures进行练习,我已经在数组上编写了第二个问题,像这样:

/**
   * Given n non-negative integers a1, a2, ..., an, where each represents a
   * point at coordinate (i, ai), n vertical lines are drawn such that
   * the two endpoints of line i is at (i, ai) and (i, 0). 
   * 
   * Find two lines, which together with x-axis forms a container such
   * that the container contains the most water.
   *
   * Efficiency: O(n)
   *
   * @param a Array of line heights
   * @return Maximum area
   */
  def maxArea(a: Array[Int]): Int = {
    @tailrec
    def go(l: Int, r: Int)(max: Int): Int = {
      if (l >= r) max
      else {
        val currArea = math.min(a(l), a(r)) * (r - l)
        val area = math.max(max, currArea)
        log debug s"Current area for $l and $r is $currArea"
        log debug s"Max area till now is $area"
        if (a(l) < a(r)) go(l + 1, r)(area)
        else go(l, r - 1)(area)
      }
    }
    go(0, a.size - 1)(0)
}

我想知道是否有更好的替代方法来编写递归函数作为遍历数组的一种方式,因为someone once told me 调用递归函数编程的GOTO。

您可以在GitHub上查看完整的源代码

谢谢。

1 个答案:

答案 0 :(得分:1)

这是一种无需递归即可实现算法的方法(并不是我实际上认为递归本质上有什么错误)。

  $('.showdiv').focus(function() {
    $('.testdiv').fadeIn(1000);
  }).focusout(function() {
    $('.testdiv').fadeOut(1000);
  });

  $('.testdiv input').change(function() {
    $('.testdiv').stop(); // end animation on the faded element
    $('.showdiv').focus(); // return focus to reinstate the focusout handler
  });

这个想法是懒惰地迭代,仅获取(需要意识到)那些需要的东西。

您会注意到,此操作迭代并计算面积的次数更少,因为它会丢弃无法超过当前面积计算的值。