当前位置: 首页 > 知识库问答 >
问题:

容器与大多数水算法-使用递归

华谭三
2023-03-14

我正在用最多的水制作leetcode#11容器

https://leetcode.com/problems/container-with-most-water/

给定n个非负整数a1, a2,..., an,其中每个表示坐标(i, ai)处的点。绘制n条垂直线,使得线i的两个endpoint位于(i, ai)和(i,0)。找到两条线,它们与x轴一起构成一个容器,使得容器中包含最多的水。

注意:容器不能倾斜,n至少为2。

var maxArea = function (height) {
            var list = [];
            for (var index = 1; index <= height.length; index++) {
                var eachCorr = {
                    x_corr: index,
                    y_corr: height[index - 1]
                }
                list.push(eachCorr);
            }

            var mainResult = reCursion(list, list.length-1,0,1);

            console.log(list);
            console.log(mainResult);

            return mainResult;
            //last vertical line * each vertical line from index=1; 
            //x-corr*(last vertical - each vertical), y-corr*(smaller vertical line)
        };

        function reCursion(arr, index, x,y) {
            //lastX and lastY use recursion to loop
            var lastX = arr[index][x];
            var lastY = arr[index][y];
            var chosenY = 0;
            var area = 0;
            var result = [];
            var maxAreaAns = 0;
            for (var i = index - 1; i >= 0; i--) {
                if (lastY > arr[i][1]) {
                    chosenY = arr[i][1];
                } else {
                    chosenY = lastY;
                }
                area = (lastX - arr[i][0]) * chosenY;
                console.log(`area = ${area} with i = ${i}, lastX=${lastX}, lastY=${lastY}`); 
                result.push(area);
            }
            if (index === 0) {
                maxAreaAns = Math.max(...result);
                return maxAreaAns;
            } else {
                return reCursion(arr, index - 1,0,1);
            }
        }

我的方法是使用递归,首先选择最后一条垂直线,乘以之前每条垂直线的x-corr差,然后选择比较时垂直线的小y-corr。

面积=(最后一条垂直线和比较垂直线的x-corr差值)*(小垂直线的y-coor)

然后使用递归选择倒数第二条垂直线,以此类推,直到选择第一条垂直线。

然后我将所有面积结果放入一个数组,并找到最大值。

我想知道为什么这个方法不能执行(lastX、lastY、区域变量未定义)。

共有1个答案

庾君博
2023-03-14

在分析了代码之后

var lastX = arr[index][x];
var lastY = arr[index][y];

两者都始终未定义。由于arr[索引]返回的是对象而不是列表,因此无法通过索引获取值。你需要这样做

var lastX = arr[index].x_corr;
var lastY = arr[index].y_corr;

这也适用于您的

if (lastY > arr[i][1]) {
      chosenY = arr[i][1];

现在,您可能已经意识到,您的函数总是作为其结果注销Infinity。这是因为当条件

if (index === 0) {
       maxAreaAns = Math.max(...result);
       return maxAreaAns;
}

如果满足并执行其中的代码,则结果数组始终为空(请尝试在没有任何输入的情况下调用Math.max()函数)。它将返回无穷大。

这是因为当index变量等于0时,循环

for (var i = index - 1; i >= 0; i--) {
       if (lastY > arr[i][1]) {
       ...
}

不会运行(因为i从-1开始),并且结果保持为空数组。

我猜您想要做的是将数组设置为全局变量,或者将其传递给下一个递归函数。

话虽如此,我实际上看不到使用递归解决这个问题的意义。与其使用递归(这显然使编写和理解代码变得困难),为什么不直接使用嵌套循环来检查组合呢?

 类似资料:
  • 给定n个非负整数a1, a2,..., an,其中每个表示坐标(i, ai)处的一个点。绘制n条垂直线,使得线i的两个endpoint位于(i, ai)和(i,0)。找到两条线,它们与x轴一起构成一个容器,使得容器中包含最多的水 关于这个问题,我不理解的是,我应该如何知道n条垂直线的y坐标值(高度)。

  • 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 说明:你不能倾斜容器,且 n 的值至少为 2。 图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝

  • 我正试图制作一个可以在C#中填充int数组的算法。基本上,作为MS Paint中的填充工具,我有一个颜色,如果我在数组中选择(x,y)坐标,它会用新的颜色替换所有初始颜色相同的邻居。 例如: 如果我把3放入(0,0),数组就变成: 所以我在递归中尝试了它,它确实有效,但不是一直有效。实际上,我有时会遇到“堆栈溢出”错误(似乎合适)。这是我的代码,如果你能告诉我哪里出了问题,那就太好了:) 谢了!

  • 从前有座山 山里有座庙 庙里有个老和尚和小和尚 老和尚对小和尚说: 从前有座山 返回1 从前有座山,山里有个庙,庙里有个和尚讲故事……这是一个古老的童谣,每个人都知道下面一句说了什么,但还要不厌其烦的说下去。犹如我们的人性,陷入一种循环,不可逃脱,无法自拔。 所以在我们现实生活中,很多时候也有所谓的重复性,而这种重复性用计算机解决的话,就能够省很多事情。 如果用一部电影来类比的话,那《盗梦空间》就

  • 我正在看下面关于极客的问题 给定n个非负整数a_1,a_2,...,a_n其中每个表示坐标(i,a_i)处的一个点。'n'画垂直线,使得线i的两个endpoint在(i,a_i)和(i,0)处。找到两条线,它们与x轴一起构成一个容器,使得容器含有最多的水。 程序应该返回一个整数,该整数对应于可以容纳的水的最大面积(最大面积而不是最大体积听起来很奇怪,但为了简单起见,我们使用的是2D平面)。 问题链

  • 我得到了三个整数操作: A-将3添加到number B-将数字 C加倍-交换number 的最后两位数字我应该编写算法来检查我是否可以在n步中使用操作A、B、C制作k素数。最后,我必须打印我用来制作k素数的操作序列。让我们假设我们有函数: 当数字为素数时,函数ifprime返回true,否则返回false。 代码: 我的问题是,我不知道如何记住正确的路径,然后打印出来。