题目
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
思路
将题目进行翻译即——需要找出给定数组中两个数字之间的最大差值(即,最大利润)。此外,第二个数字(卖出价格)必须大于第一个数字(买入价格)。
形式上,对于每组 i 和 j(其中 j>i)我们需要找出 max(prices[j] - prices[i])。
1、暴力法(leetcode中运行超时)
双层循环遍历每两个元素之间的差值,将差值与初始利润0进行比较,不断更新利润值,找到数组中的最大差值。
2、一次遍历法
(1)首先设置一个“最低价格”,其实是一个极大值,为的是进入数组后更新为数组中的较小值;
(2)设置一个利润值0;
(3)将利润值与数组元素和“最低价格”的差值进行比较,并以较大的更新利润值;
(4)将数组元素与“最低价格”进行比较,并以较小的更新“最低价格”;
(5)一次遍历数组循环3、4两步,一次遍历法之所以只有一次遍历,是因为要想得到最大差值,只需要与数组中更小的元素做差,不断更新较大的利润,而非和数组中的每个元素计算做差;
求解方法
1、暴力法
int maxProfit(vector<int>& prices) {//暴力求解,leetcode会超时
int ans = 0;
int n = (int)prices.size();
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
ans = max(ans, prices[j] - prices[i]);
}
}
return ans;
}
2、一次遍历法
int maxProfit1(vector<int>& prices) {//一次遍历法
int minprice = int(1e9);//最低价格,给一个极大的值,以便找到数组中的最小数
int maxprofit = 0;//最高收益
for (int i = 0; i < prices.size(); i++)
{
maxprofit = max(maxprofit, prices[i] - minprice);
minprice = min(minprice, prices[i]);
}
return maxprofit;
}