📜  门| GATE-CS-2007 |第 61 题(1)

📅  最后修改于: 2023-12-03 15:42:16.546000             🧑  作者: Mango

题目

GATE-CS-2007 | 第 61 题

给定一个长度为n的数组,其中第i个元素表示第i天的股票价格。若你只允许完成最多一笔交易(即买入并卖出一次),请设计一个算法来找到最大的收益。

例1:

输入: [7,1,5,3,6,4] 输出: 5 解释: 在第2天(股票价格= 1)的时候买进,在第5天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。注:依据题意,买入和卖出不能同时进行,因此选择相邻最小值买入,相邻最大值卖出。

例2:

输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下,无论何时都不应进行交易。即最大利润为0。

方法:

股票问题的一般解决方案是动态编程。但是,本问题可以从比肩读取的技术中获得良好的简化。下面是对题目进行分析的方法。

如果我们观察股票的价格曲线,我们需要找到一个值i,在第i天之前买入,且在第i天之后卖出,以获得最大的利润。如果在第i天之前没有比肩,先前思考的方案很容易适用。我们可以维护一个数组minprice,其中minprice[i]表示第i天之前的最小股票价格。然后我们可以通过检查第i天之后的价值与minprice[i]之间的差异来计算最大利润。

int maxProfit(int prices[], int n) { int minPrice = INT_MAX; int maxprofit = 0; for (int i = 0; i < n; i++) { if (prices[i] < minPrice) minPrice = prices[i]; else if (prices[i] - minPrice > maxprofit) maxprofit = prices[i] - minPrice; } return maxprofit; }

参考:

[股票问题] (https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/)

[卡迪根学院] (https://www.geeksforgeeks.org/)