Facing The Sun Problem in Java2025年5月6日 | 阅读 6 分钟 “面向太阳”问题 涉及确定一排建筑中可以看到太阳的建筑数量,假设阳光来自特定方向(通常是左侧)。每栋建筑的高度都会影响可见性,因此这是一个通常需要遍历和比较技术才能有效解决的问题。 示例 输入 [4, 2, 3, 1, 5] 输出 2 解释 第一栋建筑(高度 4)可以看到太阳,因为它最初是最高的。第二栋建筑(高度 2)较矮且被遮挡。第三栋建筑(高度 3)也被第一栋较高的建筑遮挡。第五栋建筑(高度 5)比所有之前的建筑都高,可以看到太阳。 使用贪心算法算法步骤 1:理解问题: 我们需要确定当阳光从左侧照射时,有多少栋建筑可以看到太阳。如果一栋建筑比它前面的建筑都高,那么它就能看到太阳。 步骤 1.1:分析输入和输出: 首先,检查输入,它是一个建筑高度的数组。每个高度代表一排建筑的大小。输出是可以看到太阳的建筑数量,考虑到阳光来自左侧。如果一栋建筑比它前面的所有建筑都高,那么它就能看到太阳。 步骤 2:初始化变量: 创建一个 变量 `maxHeight` 并将其设置为 0。它将存储遇到的最高建筑高度。创建一个变量 `count` 并将其设置为 0。它将跟踪可以看到太阳的建筑数量。 步骤 2.1:设置初始条件: 在遍历建筑之前,将 `max-height` 的初始值设置为 0,因为还没有遇到任何建筑。这将有助于确定哪些建筑比迄今为止遇到的最高建筑更高。将 `count` 变量设置为 1,因为第一栋建筑总是可以看到太阳。 步骤 3:遍历数组: 从左到右遍历建筑高度的数组。 步骤 3.1: 对于每栋建筑,将其高度与其 `maxHeight` 进行比较。如果当前建筑的高度大于 `maxHeight`,则它可以看到太阳。将 `maxHeight` 更新为当前建筑的高度。将 `count` 增加 1。 步骤 4:返回结果: 遍历完整个 数组 后,`count` 将包含可以看到太阳的建筑总数。 步骤 4.1:处理边缘情况: 在返回结果之前,处理任何边缘情况。例如,如果输入数组为空,则返回 0,因为没有建筑可以看到太阳。同样,如果数组只包含一栋建筑,它总是会被计数,因为它将是该排中的最高建筑。 步骤 5:输出结果: 完成迭代后,`count` 变量保存可以看到太阳的建筑数量。将此值作为结果返回或打印。它是最终输出,指示该排中有多少建筑可以看到无遮挡的阳光。 文件名:FacingTheSun.java 输出 2 复杂度分析时间复杂度该算法只遍历一次建筑高度数组,为每栋建筑执行一次常数时间的比较和更新。因此,时间复杂度为 O(n),其中 n 是建筑数量。它确保了解决方案的效率,时间复杂度与输入大小成线性关系。 空间复杂度此解决方案的空间复杂度为 O(1),因为它只使用恒定的额外空间,而与输入大小无关。`maxHeight` 和 `count` 变量是仅需的额外存储,因此空间复杂度与建筑数量无关。 使用堆栈算法步骤 1:理解问题: 想象一下建筑排成一条直线。阳光从左边照射。一栋建筑只有在其左边的所有建筑都比它矮时才能看到太阳。您的任务是根据此条件计算可以看到太阳的建筑数量。 步骤 2:规划方法: 要确定哪些建筑可以看到太阳,我们需要:跟踪当前“未被遮挡”的建筑的高度。使用一个结构(在本例中为堆栈)来存储在遍历数组时的高度。仅当一栋建筑比它前面的所有建筑都高时,才将其添加到堆栈中。 步骤 3:设置解决方案: 初始化一个空堆栈:堆栈将存储可以看到太阳的建筑的高度。从该排的第一栋建筑开始,按顺序处理每一栋建筑。 步骤 3.1:初始化用于跟踪的变量: 在开始遍历之前,请确保所有必需的变量都已准备好。例如,定义用于存储建筑高度的堆栈以及用于保存可见建筑的最终计数的变量。此设置确保了下一步的结构化和高效流程。 步骤 4:遍历高度数组: 对于数组中的每栋建筑:检查堆栈是否为空:如果堆栈为空,则表示尚未处理任何建筑。将第一栋建筑的高度添加到堆栈中,因为它总是可以看到太阳。 步骤 4.1:将当前高度与堆栈顶部进行比较: 如果当前建筑的高度大于堆栈顶端的高度,则这栋建筑可以看到太阳。将其添加到堆栈中。 如果当前高度小于或等于堆栈顶部的高度,则该建筑被遮挡,无法看到太阳,将其忽略。对数组中的每栋建筑重复此过程。 步骤 5:计算建筑数量: 处理完所有建筑后:可以看到太阳的建筑数量等于堆栈中的高度数量。将堆栈的大小作为结果返回。 步骤 5.1:确保所有有效建筑都已计数: 遍历数组后,请确认堆栈中仅留下代表可以看到太阳的建筑的高度。这些高度必须从左到右严格递增,以确保没有较矮的建筑遮挡已添加的较高建筑。堆栈的大小反映了未被遮挡的建筑的最终数量。 步骤 6:处理边缘情况:无建筑(空数组): 如果输入数组为空,则返回 0,因为没有建筑可以看到太阳。 单栋建筑: 如果只有一栋建筑,它总是可以看到太阳。返回 1。所有相同高度的建筑: 该排中只有第一栋建筑可以看到太阳,因为相同高度的后续建筑将被遮挡。 文件名:FacingTheSun.java 输出 2 复杂度分析时间复杂度基于堆栈的方法的时间复杂度为 O(n),其中 n 是建筑数量。在遍历数组时,每栋建筑都恰好处理一次。堆栈操作(push 和 peek)是常数时间,因此总体复杂度保持线性,确保了对大型输入的效率。 空间复杂度基于堆栈的方法的空间复杂度为 O(n),其中 n 是建筑数量。在最坏的情况下,如果每栋建筑都比前一栋高,则所有建筑都可能被添加到堆栈中。因此,堆栈需要与输入大小成比例的空间进行存储。 下一个主题Java 中的中间数字 |
如今,系统都配备了多核处理器。多核处理器可以加快计算速度。因此,程序员有必要有效地利用多核处理器,以便在更短的时间内生成结果。Java 中的 Fork/Join 用于实现...
5 分钟阅读
Java 是使用最广泛的编程语言之一,遵循面向对象原则,并以其健壮性和可移植性而闻名。在该语言中,纯函数概念在函数式编程中起着举足轻重的作用,它提供了一种编写可靠且可预测的代码的结构化方法。在...
阅读 4 分钟
给定一个仅由数字组成的字符串,该字符串表示一个数字。我们的任务是将数字字符串拆分,使得拆分后形成的每个数字段都是一个素数。另外,...
阅读 10 分钟
ISBN 是 Java 中的另一个特殊数字。ISBN 代表国际标准书号,几乎每本书都带有此号。ISBN 是一个十位数的唯一编号。借助 ISBN,我们可以轻松找到任何书籍。ISBN 号码是...
阅读 3 分钟
Java 8 的 lambda 表达式功能使得编写更短、更具表达力的代码成为可能。您可以使用 lambda 表达式有效地将代码作为数据传输,或将功能视为方法参数。它们经常用于函数式编程,从而催生了...
阅读 4 分钟
在 Java 编程中,Dyck 路径是一种以特定方式探索网格的方法。考虑一个正方形网格,您希望到达右上角,同时保持在对角线上方。想法是看看您可以使用多少不同的路径...
7 分钟阅读
这是 Google、Amazon、TCS、Accenture 等顶级 IT 公司面试中经常出现的问题。通过解决该问题,人们希望检查面试者的逻辑能力、批判性思维和解决问题的能力。因此,在本节中,我们将……
阅读 13 分钟
?在 Java 中,您可以使用 `java.util.Date` 类提供的 `equals()` 方法来检查日期是否相等。此方法比较两个 `Date` 对象的 time 值,以确定它们是否表示同一时间点。下面是一个演示如何检查的示例程序...
阅读 4 分钟
在 Java 中,设计原则是在设计决策中用作规则的一组建议。在 Java 中,设计原则与设计模式的概念类似。设计原则和设计模式之间的唯一区别是设计原则更具通用性...
5 分钟阅读
Java 中的 ThreadGroup Java 提供了一种方便的方式将多个线程分组到单个对象中。这样,我们可以通过一次方法调用来挂起、恢复或中断一组线程。注意:现在 suspend()、resume() 和 stop() 方法已弃用。Java 线程组实现...
阅读9分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India