Java 中股票买卖利润最大化2024 年 9 月 10 日 | 阅读 8 分钟 这是技术面试中常问的突出问题之一。在此问题中,会给出一个表示不同日期股票成本的整数数组。请注意,一个人可以多次买卖股票。在本节中,我们将讨论 **Java 中股票买卖的最大化利润问题**。让我们来理解一下这个问题。 考虑以下数组。 int arr[] = {50, 90, 130, 155, 20, 267, 347} 在这里,第一天的股票成本是 50。第二天,成本变为 90,第三天变为 130,依此类推。因此,一个人可以在第一天购买股票,并在第四天卖出。因此,利润为 155 - 50 = 105。再次,可以在第五天购买股票,并在第七天卖出。因此,利润为 347 - 20 = 327,总利润为 105 + 327 = 432,这是赚取的最高利润。 方法:朴素在这种方法中,会购买一只股票,然后每天在有利可图时将其卖出。此外,还需要跟踪迄今为止赚取的最高利润。以下程序对此进行了说明。 文件名: MaxProfitStock.java 输出 The price of the stock on different days is: 50 90 130 155 20 267 347 The maximum profit earned is: 432 方法:高效为了使解决方案更高效,我们将不使用递归。在这种方法中,我们将寻找局部最小值和最大值。局部最小值将被视为起始索引,局部最大值将被视为结束索引。如果局部最小值不存在,则返回。我们还将通过更新买卖对的数量来更新解决方案。观察以下代码。 文件名: MaxProfitStock1.java 输出 The price of the stock on different days is: 50 90 130 155 20 267 347 Buy the stock on day: 1 Sell the stock on day: 4 Buy the stock on day: 5 Sell the stock on day: 7 Thus, the total profit is: 432 复杂度分析:外循环运行到 j = 0 到 size - 1。两个内循环在每次迭代中都会增加 j 的值。因此,这两个内循环有助于 j 更快地达到 size - 1。因此,程序的 time complexity 为 O(size)。程序还使用一些额外的空间来存储买卖股票的日期。因此,程序的 space complexity 为 O(size),因为天数不能超过数组中存在的元素数量。 方法:波谷波峰在这种方法中,我们需要查找下一个更大的元素并将其从当前元素中减去。我们这样做是因为除非达到最小值,否则差值会持续增加。请注意,我们没有使用任何额外的空间。此方法的时间复杂度仍为 O(size)。 以下 Java 程序对此进行了说明。 文件名: MaxProfitStock2.java 输出 The price of the stock on different days is: 50 90 130 155 20 267 347 The maximum profit earned is: 432 注意 1:如果股票价格按降序排列。那么,就无法赚取利润。例如 int p[] = { 800, 795, 505, 440, 311, 261, 181, 101, 40, 5}; 股票成本每天都在下降。因此,如果一个人在某一天购买了股票,那么在购买股票后的任何一天,股票的成本都会低于购买成本。因此,他会遭受损失。 注意 2:这个问题可以有很多变种。其中一个变种是在只允许买卖一次股票的情况下最大化利润。现在,这个问题类似于找到两个元素之间的最大差值,其中较大的值出现在较小的值之后。如果我们取连续几天的股票价格 int p[] = {50, 90, 130, 155, 20, 267, 347},那么一次买卖的最大利润是 347 - 20 = 327。 文件名: MaxProfitStock3.java 输出 The price of the stock on different days is: 50 90 130 155 20 267 347 The maximum profit earned is: 327 类似地,可以编写代码来最大化允许最多两次、或最多三次买卖股票的利润,依此类推。 下一个主题Java 中的排列系数 |
在方法之间传递和返回对象是 Java 编程的基本功能,对于创建可靠的、模块化的程序至关重要。在本节中,我们将讨论 Java 中对象传递和返回,探索各种类型和方法,并提供完整的...
5 分钟阅读
泛型 Comparator 是一个 Java 接口类型,它允许用户比较相同类型的两个对象。它在 `java.util` 包中实现,并且是集合框架的一部分。泛型 Comparator 接口允许用户为对象定义自己的比较逻辑……
5 分钟阅读
为了确定字符串中相等对的数量,需要找到文本中相同字符出现在不同位置的所有实例。当两个字符相同但出现在不同索引时,一对被认为是 "相等" 的。目标是确定有多少...
5 分钟阅读
Java 作为一种面向对象的编程语言,为处理对象及其交互提供了强大的支持。处理对象的一个重要方面是能够将它们转换为或强制转换为不同的类型或类。Java 提供了类型转换对象的机制,允许开发人员更改...
阅读 6 分钟
M×N 网格中每个块边界的着色作用可以根据用于确定包含该块的单元格周长着色的可能数量的特定模式来描述。这种类型的...
5 分钟阅读
在 Java 中查找具有不同元素的数组的交集涉及识别两个或多个数组共有的公共元素。由于每个数组中的元素都是唯一的,因此任务简化为有效地比较集合。此过程在数据过滤、集合...等各种应用程序中很有用。
阅读 8 分钟
最大正方形子矩阵问题是指在一个给定的二进制矩阵中找到最大的正方形子矩阵的大小,其中子矩阵的所有元素都为 1。这是一个经典的动态规划问题,用于高效地解决二维问题。在 Java 中,…
阅读 10 分钟
在 Java 中,有多种方法可以计算电费。我们可以使用静态值、命令行参数、方法和函数、用户定义方法以及 do-while 和 for 循环来计算电费。让我们一一了解它们:使用静态方法在这种情况下...
5 分钟阅读
如果一个数字 num 加上数字 num + 1 然后拼接起来是一个完全平方数,那么这个数字 num 就被称为 Sastry Number。例如 1:输入 int num = 183 输出 183 是一个 Sastry Number。解释:如果我们把数字 183 和数字 184 (183 + 1) 拼接起来...
阅读 4 分钟
在 Java 编程的世界中,有许多场景可能需要计算给定字符串中不同字符的数量。无论我们是开发文本分析工具、文字游戏,还是任何处理文本数据的应用程序,了解如何……
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India