Indexes of Subarray Sum Problem in Java2025年5月3日 | 阅读4分钟 为了解决 **Java 中的子数组求和问题**,我们需要找出连续子数组中总和等于特定目标的那些特殊索引。这个问题在算法面试中很常见,尤其是在讨论使用哈希表优化时间复杂度时。 问题陈述给定一个整数 数组 arr[] 和一个整数 targetSum,确定一个连续子数组的索引,该子数组的和等于 targetSum。如果找到,则返回其开始和结束索引;否则,则指示其不存在。 问题解决方案我们将使用一个 HashMap 来存储累积和作为键,并以其对应的索引作为值。当我们遍历数组时,我们会维护元素的运行总和。在每次迭代中
让我们在 Java 程序中实现上述方法。 文件名:SubarraySum.java 输出 Subarray found from index 1 to index 3 解释findSubarrayWithTargetSum() 方法首先初始化一个名为 cumulativeSumMap() 的 HashMap,它将存储遇到的累积和作为键,并将相应的索引作为值。此外,我们还初始化一个 cumulativeSum 变量来跟踪我们在遍历数组时元素的总和。 对于数组中的每个元素,我们将其加到 cumulativeSum 中。如果此累积和等于 targetSum,我们立即知道从开始(索引 0)到当前索引的子数组是解决方案。否则,我们检查 cumulativeSum - targetSum 是否存在于 map 中。如果存在,那么我们就找到了一个具有所需和的子数组,因为存储索引之后的数组部分直到当前索引必须加起来等于 targetSum。 然后我们返回此子数组的索引。如果两个条件都不满足,我们会将当前的累积和和索引存储在 map 中,以便与未来的元素进行比较。如果循环在未找到解决方案的情况下完成,我们返回 {-1, -1} 来表示不存在这样的子数组。main 方法使用示例数组和目标和测试此函数,并在找到解决方案时显示索引。 复杂度分析时间复杂度 该解决方案的时间复杂度为 O(n),其中 n 是输入数组的长度。因为
因此,整个操作需要一次遍历数组,导致线性时间复杂度 O(n)。 空间复杂度 此解决方案的空间复杂度受 HashMap 大小的限制,而 HashMap 的大小与输入数组的长度成正比。所提出解决方案的空间复杂度也为 O(n),因为我们使用 HashMap 来存储累积和及其对应的索引。 在最坏的情况下,数组中的每个元素都可能具有唯一的累积和,这需要将所有这些和存储在 HashMap 中,从而导致 O(n) 的空间使用。 结论这种使用累积和和 HashMap 来解决子数组求和问题的方法对于这种特定类型的问题来说是最佳的,因为它具有高效的时间和空间复杂度。关键在于认识到,如果任何时候的累积和减去 targetSum 之前已经被遇到过,那么在之前存储的该累积和的索引和当前索引之间必然存在一个具有所需和的子数组。 这种方法与涉及检查所有可能子数组的朴素(O(n^2))方法相比有显著改进,使其适用于大型数据集。该算法的线性时间复杂度和简单的实现使其成为高效解决连续子数组求和问题的理想选择。 下一话题Java 中的自守数程序 |
给定一个字符串,我们的任务是使用最多 N/2 次移动来排序一个由前 N 个不同字母组成的字符串。每次移动包括以下步骤:选择任何三个不同的索引。在这些索引处,执行循环移位...
11 分钟阅读
在本节中,我们将学习什么是跳跃数,并创建 Java 程序来检查给定的数字是否为跳跃数。跳跃数程序经常在 Java 编码测试和学术中被问到。跳跃数 一个数字 N 被称为跳跃数...
7 分钟阅读
最近最少使用(LRU)是一种缓存淘汰技术,当缓存大小增长到其最大分配容量时,它将从缓存中删除最近最少访问的项目。此外,缓存必须具有强大的同步机制,因为多个线程可能会访问...
阅读 13 分钟
在 Java 中,将 String 转换为字符数组是一项常见任务。在 Java 中,我们主要将字符串转换为 char 数组进行字符处理、迭代和字符串操作。有以下方法可以将 String 转换为 char[] 数组:使用 Arrays.toCharArray() 方法使用 Stream 使用 String.split() 方法使用 Arrays.toCharArray()...
阅读 2 分钟
我们收到一个字符串作为输入。任务是确定给定的字符串是否以大写字母开头。示例 1:输入:String s = "Hello World" 输出:这是一个有效字符串。说明:给定的字符串以“H”开头,这是一个大写字母。示例 2:输入:String s...
阅读 3 分钟
在 Java 中,我们使用 int 和 Integer 来存储整数类型的数据。现在,由此产生的问题是,如果两者都用于存储相同类型的数据,那么它们之间有什么区别,为什么我们需要……
阅读 4 分钟
在 Java 编程中,标识符通过充当符号名称来帮助识别和使用程序中的不同元素。这些标识符可以代表许多实体,包括类、变量、方法、包、常量等。开发人员可以通过...提高可读性。
阅读 6 分钟
Java 中的 Optional 类是一个显式的容器对象,它包含一个可能存在也可能不存在的非 null 值。它最初在 Java 8 中使用,用于提供一种更强大、更具成本效益且更安全的方式来处理可能...
阅读 4 分钟
在 Java 中,当需要管理动态数据集合时,ArrayList 是一个受欢迎的选择。有时,我们可能需要将元素从一个 ArrayList 复制到另一个。该操作可以轻松执行,但为了确保,了解整个过程至关重要...
5 分钟阅读
双重花括号初始化是 Java 中一种用于以简洁方便的方式初始化类实例并为其字段提供初始值的一种技术。它涉及在实例化代码块中使用嵌套花括号。尽管这种方法可以...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India