LeetCode刷题篇—121.股票问题

LeetCode刷题篇—121.股票问题

题目

给定一个数组 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;
	}

猜你喜欢

转载自blog.csdn.net/guo_xyx/article/details/114294172
今日推荐