Java 中的金字塔过渡矩阵2025年5月12日 | 阅读 5 分钟 在此问题中,我们的任务是逐块构建金字塔。每个块都有一个与字母对应的颜色。金字塔的构建方式是,每一层比其下方的一层少一个块。要构建金字塔,一个块堆叠在它正下方的两个相邻块的上方,形成一个三角形。 堆叠积木时,我们需要遵守特定的规则:只允许使用特定的三角形设计。使用一个三字母的 字符串 来表示模式,前两个字母表示底部积木的左右颜色,第三个字母表示堆叠在上面的积木的颜色。 我们还得到一份允许的设计列表,以及金字塔的底部,形式为一个字符串 bottom。目标是找出是否可以完全构建到顶部,同时确保形成的每个三角形模式都包含在允许的模式列表中。如果可以这样构建,则返回 true;否则,返回 false。 示例 1 输入 ![]() String bottom = "BCD" String allow = ["BCC", "CDE", "CEA", "FFF"] 输出: true 解释 右侧显示了允许的三角形模式。 通过在第 2 层构建“CE”,然后在第 1 层构建“A”,我们可以从底部(第 3 层)开始。 “BCC”、“CDE”和“CEA”是构成金字塔的三个三角形设计。它们都已获批准。 示例 2 输入 ![]() String bottom = "AAAA" String allowed = ["AAB", "AAC", "BCD", "BBE", "DEF"] 输出: false 解释 右侧显示了允许的三角形模式。 从第 4 层开始,我们可以通过多种方式构建第 3 层,但如果我们尝试所有选项,最终都会被困住,无法构建第 1 层。 方法:使用递归深度优先搜索使用深度优先搜索,递归函数 dfs 从底部开始,逐层构建潜在的金字塔配置。根据当前正在分析的积木,每个 dfs 调用都尝试构建下一层。 在给定的代码中,为了确定是否可以从给定的底部 (bottom) 和允许的过渡 (allow) 构建金字塔,一个 Java 程序使用位运算和带记忆化(memoization)的深度优先搜索 (DFS) 来创建一个金字塔过渡矩阵。位表示用于在过渡矩阵 (trans_Matrix) 中存储有效的过渡。DFS 函数会迭代地构建金字塔,验证每一层是否都可以根据提供的规则创建。通过记忆化(memorization hash map)来优化重复的状态计算,从而提高效率。基本情况保证了当顶部只剩下一块积木时,函数返回 true。 算法 步骤 1: 为了使用位表示来存储潜在的过渡,创建一个名为 trans_Matrix[7][7] 的二维整型数组。 步骤 2: 使用记忆化 HashMap 来保存先前计算的结果以进行优化。 步骤 3: 逐一遍历 allow 列表中的每个过渡字符串。 步骤 3.1: 将过渡的第一个和第二个字符分别提取为 first 和 second。 步骤 3.2: 获取它们的 ASCII 值并减去 'A',将它们转换为索引。 步骤 3.3: 使用按位或(bitwise OR)设置 trans_Matrix 中匹配的条目,以存储到第三个字符的过渡。 步骤 4: 使用一个空的 StringBuilder 作为 nextLevel,并将 bottom 作为 curr_Level 来调用 dfs(curr_Level, nextLevel) 方法。 步骤 5: 如果 curr_Level 只有一个块(金字塔已正确创建),则返回 true。 步骤 6: 如果 nextLevel 达到了所需的长度 (curr_Level.length() - 1), 步骤 6.1: 对于下一层,递归调用 dfs(nextLevel.toString(), new StringBuilder())。 步骤 7: 使用 curr_Level + "." + nextLevel.toString() 创建一个唯一的键。 步骤 8: 如果该键存在于记忆化中,则返回其存储的值。 步骤 9: 使用 curr_Level,查找第一个和第二个积木的索引。 步骤 10: 从 trans_Matrix 中检索 potentialTransitions.[first] [second]。 步骤 11: 循环遍历七个不同的字符('A' 到 'G')。 步骤 11.1: 如果字符 'A' + i 的过渡是可行的,将其添加到 nextLevel。 步骤 11.1.1: 递归调用 dfs(curr_Level, nextLevel)。 步骤 11.1.2: 如果成功,则将 true 存储在记忆化中并返回 true。 步骤 11.1.3: 如果不成功,则回溯并删除最后添加的字符。 步骤 12: 如果没有合适的过渡,则返回 false 并将 false 存储在记忆化中。 步骤 13: 将 allow 列表和 bottom 字符串设置为初始值。 步骤 14: 创建类的一个实例后,调用 pyramidTransition(bottom, allow)。 步骤 15: 返回结果(false 或 true)。 实施输出 true 复杂度分析 上述代码的时间复杂度为 O(7(N-1)),其中 'N' 表示 bottom 的长度,空间复杂度为 O(7(N-1)),因为每个递归步骤在每个过渡处都可以分支出七个选择。 下一个主题Spark Java |
矩阵遍历是计算问题解决中常见的难题,与路径查找、模拟和游戏有关。网络上讨论的一个此类问题是“腐烂的橙子问题”,它模拟了橙子网格上腐烂的传播。这是一个理论上的...
7 分钟阅读
排序是将列表或数组的元素按特定顺序排列的一种方法。顺序可以是升序或降序。数值顺序和字典序(字母顺序)是一种广泛使用的顺序。在本节中,我们将学习如何对数组进行排序...
阅读 6 分钟
在 Java 中,交换或替换对象可以通过将一个对象的值赋给另一个对象并反之来实现。可以通过使用临时变量来保存一个对象的值,同时将其与另一个对象的值交换来实现...
5 分钟阅读
什么是身份验证?身份验证是验证用户提供的凭据是否与系统中存储的凭据匹配的过程,以证明用户就是他们所说的那个人。如果凭据匹配,则授予访问权限。如果不匹配,则拒绝访问。身份验证方法单因素身份验证:这是...
阅读 6 分钟
Java 是世界上使用最广泛的编程语言之一,以其可靠性和可移植性而闻名。然而,像任何其他编程语言一样,Java 并非没有挑战。程序员,尤其是初学者,在开发过程中经常会犯错误。这些错误可能...
5 分钟阅读
查找岛屿数量问题是通常在顶级公司编码轮面试中提出的标准问题。该问题基于图论。在图论中,我们查找连通分量的数量。在此问题中,我们必须查找相同的数量。因此,在...
阅读 6 分钟
给定一个数字 n。任务是在不使用除法 (/) 或取模 (%) 运算符的情况下,检查一个数字是否是 5 的倍数。示例 1:输入:30 输出:30 是 5 的倍数:true 说明:30 的最后一位数字是 0,因此它是...
5 分钟阅读
在本教程中,我们将了解如何在 Java 中多次执行 main() 方法。方法:使用静态块我们知道静态块首先执行。因此,它可以用来显式执行 main 方法。一个被隐式执行为主...
阅读 2 分钟
在 Java 中,用于输入身份验证凭据以访问受限页面的表单称为登录表单。登录表单仅包含两个字段,即用户名和密码。每个用户都应拥有唯一的用户名,该用户名可以是电子邮件、电话号码或...
阅读 3 分钟
巴斯塔尔是印度恰蒂斯加尔邦一个风景如画的地区,而爪哇是印度尼西亚一个重要的岛屿,乍一看可能相去甚远。一个坐落在茂密森林和原住民部落之间的文化天堂,另一个是东南亚一个繁华的技术中心...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India