LeetCode 中的 Mendix:双塔奇观 | Mendix

跳到主要内容

LeetCode 中的 Mendix: 两座塔

应对中等难度的挑战

在我之前的帖子中,我接受了完成 leetcode.com 问题的挑战,以证明低代码不仅仅是一种单一形式的解决方案——它具有解决更困难的技术问题所需的灵活性。我选择的问题是 Two Sum,这是网站上的第一个挑战,也是“简单”的挑战之一(您可以在此处阅读全部内容).

这次我要解决一个更棘手的问题:第十一个挑战——”盛水最多的容器”——中等难度的挑战。这个问题需要取一组柱子的高度,然后找出哪一对柱子形成的容器可以容纳最多的水;或者它们之间有最大的矩形面积。

“盛水最多的容器” – 从哪里开始

在上一次挑战中,我们首先接受挑战的表面意义,在公平的竞争环境中应对挑战,尽可能使用基本方法,然后研究如何用低代码完成。这次我们将跳过这一步,直接用低代码解决这个问题。

首先,我们需要一些数据。我们将创建一个实体来存储结果,并创建一个子实体来创建“塔”数据:

该图显示了如何创建一个实体来存储我们的结果,以及如何创建一个子实体来创建“塔”数据

这将为我们提供一个空间来随机生成一系列值并将它们按设定的顺序放置,以及将它们分组在一起以存储我们尝试的结果。不过,在我们随机生成数据集之前,最好根据示例创建一个值列表。用低代码执行此操作并不是特别优雅,但它很简单:我们只需一次创建一个项目,将其链接到尝试并返回我们的“尝试”实体。

图像显示如何一次创建一个每个项目,将其链接到尝试并返回我们的“尝试”实体。

虽然不是很美观,但可以帮我们达到目标。右侧的图表是根据我们刚刚创建的数据呈现的。

该图显示了根据我们刚刚创建的数据呈现的图表。

第一次尝试——暴力破解

我们将从基础开始,进行一次强力尝试。我们可以肯定,这不会是最好的解决方案,但找到给定数组的正确答案总是值得的,这样当我们转向更高效的版本时,我们可以检查我们的答案。为此,我们将使用嵌套循环:第一个循环遍历所有 Towers,第二个循环遍历外层循环中当前迭代器之后的每个 Towers。

显示嵌套循环的图像。

从 Microflow 中可以看出,它的效率是 O(n2),不是很好,但让我们检查一下它是否能得出正确的答案。

显示效率测试结果的图像。

从结果表中我们可以看出,我们得出了正确的结论。太好了。下一步让我们看看我们能否以更有效的方式做到这一点。

下一次尝试——追求效率

为了做到这一点,我们需要找出找到该容器的最快最佳方法,就像我们上一个例子一样,使用指针。
我们将从两端开始向内移动,保留最高的塔,并移动另一个指针。我们需要检查每个体积并保存日志,以便对其进行排序以找到最大的体积。通过这种方式迭代,我们从检查最大宽度转向检查最大高度,并检查计算体积的所有最佳组合。

为了做到这一点,我们将解决上一个练习中的一个缺点。 Mendix默认情况下,不允许通过索引检索内存列表中的元素。从数据库中提取时,您可以轻松完成此操作,但效率不高。为了纠正这个问题,我们可以创建一个简单的 Java 操作:

该图显示了如何创建一个简单的 Java 操作。

扩展功能 Mendix 使用 Java 操作

真正的优点之一 Mendix 是平台不会将您限制在工具箱中的工具上。您可以通过从市场中获取某些东西或创建自己的自定义 Java 操作来快速轻松地扩展功能!在我们的例子中,创建此函数、传入列表、然后传入索引,然后返回相应对象非常简单。

图像显示如何制作此函数,传入一个列表,然后是一个索引,然后返回适当的对象。

现在我们可以像大多数编程语言一样使用指针来访问列表。为了高效传递,我们需要两个整数指针来跟踪两端的检查,以及一个列表来存放结果。

图像显示创建两个整数指针来跟踪我们从两端的检查,以及一个用于放置结果的列表。

然后我们将启动一个 While 循环,并不断迭代,直到我们的两个指针都指向一个 Tower,此时我们就知道该停止了。在这个循环中,我们将获取每个指针的 Tower,并计算 Tower 之间可以容纳的体积。在循环过程中,我们还将跟踪我们在之前在 Attempt 实体中添加的属性中找到的最大体积。这样我们就知道最大的体积是多少,以及哪两个 Tower 创造了这个体积。

在结束循环迭代并进入下一个循环之前,我们将检查刚刚比较的两座塔中哪座更高。如果是塔一,我们将减少指针二,如果是塔二,我们将增加指针一。这将引入指针,直到它们在同一座塔相遇并满足我们的 While 循环转义子句。所有这些看起来都像这样……

图像显示我们刚刚比较的两座塔中哪座更高。

效率尝试的结果

最后进行几次提交来跟踪我们的尝试,我们就完成了。然后我们可以执行新流程并查看结果:

该图显示,我们仅用六次尝试就得出了正确的结论,而使用蛮力方法则需要三十六次尝试。
在这里,我们可以看到,我们只尝试了六次就得出了正确的结论,而使用蛮力方法则需要尝试三十六次。这意味着我们又一次以低代码成功完成了挑战,只需添加少量代码就可以让生活变得更轻松一些。

选择你的语言