Java 求解买卖股票的时机 II

该博客讨论了一道关于计算股票交易最大利润的题目。通过贪心算法分析,解释了如何从每天的正利润中找到股票买卖的最佳时机,强调了局部最优解如何转化为全局最优解。同时,也提到了动态规划的解题思路,包括dp数组的定义、初始化、递推公式和遍历逻辑顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

在这里插入图片描述

二、贪心算法分析

对于题目,第 0 天买入,第 3天卖出,利润为:prices[3]-prices[0]

可以分解为:(prices[3]-prices[2])+(prices[2]-prices[1])+(prices[1]-prices[0])

在这里插入图片描述
所以,我们只需要收集每天的正利润就可以,收集正利润的区间,就是股票的买卖区间,而且我们关注的是最终的利润,也

股票经纪人问题是一道经典的贪心算法问题。以下是Java的实现: ```java import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class StockBroker { private static class Stock { int buyTime; // 买入时间 int sellTime; // 卖出时间 int profit; // 利润 Stock(int buy, int sell, int profit) { this.buyTime = buy; this.sellTime = sell; this.profit = profit; } } public static List<Stock> getBestStocks(int[] prices) { List<Stock> stocks = new ArrayList<>(); int n = prices.length; // 找出所有买卖时机和利润 for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { int profit = prices[j] - prices[i]; stocks.add(new Stock(i, j, profit)); } } // 按照利润从大到小排序 Collections.sort(stocks, Comparator.comparingInt(s -> -s.profit)); // 找出不重叠的买卖时机 List<Stock> result = new ArrayList<>(); boolean[] used = new boolean[n]; for (Stock stock : stocks) { boolean overlap = false; for (int i = stock.buyTime; i <= stock.sellTime; i++) { if (used[i]) { overlap = true; break; } } if (!overlap) { for (int i = stock.buyTime; i <= stock.sellTime; i++) { used[i] = true; } result.add(stock); } } return result; } public static void main(String[] args) { int[] prices = {2, 5, 3, 7, 1, 4, 9, 6}; List<Stock> result = getBestStocks(prices); for (Stock stock : result) { System.out.printf("Buy at %d, sell at %d, profit %d%n", stock.buyTime, stock.sellTime, stock.profit); } } } ``` 在这个实现中,我们首先找出所有可能的买卖时机和利润,并按照利润从大到小排序。然后,我们从利润最大的股票开始,依次检查它的买卖时机是否与之前选择的股票重叠。如果没有重叠,则选择该股票,并标记其买卖时机上的天数为已使用,以便下次检查。最终我们得到的所有股票即为最佳的选择。 注意:此实现的时间复杂度为 $O(n^3)$,在实际问题中可能不太适用。可以使用更高效的算法来解决股票经纪人问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值