我正在用最多的水制作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、区域变量未定义)。
在分析了代码之后
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。 代码: 我的问题是,我不知道如何记住正确的路径,然后打印出来。