【leetcode】-121-买卖股票的最佳时期

【方法一:】

维护一个最小价格和最大利润,时间复杂度为n

int maxProfit(vector<int>& prices) {
	int min_price = INT_MAX;
	int max_profit = 0;
	for (int i = 0; i < prices.size(); ++i) {
		min_price = min(prices[i], min_price);
		max_profit = max(max_profit, prices[i] - min_price);
	}
	return max_profit;
}

【方法二:动态规划】

  • 1.确定状态
    • f[i]表示前i天的最大利润
    • 子问题:前i天的最大利润=前i-1天的最大利润与第i天的利润做比较
    • 还是要维护一个最小价格
  • 2.转移方程
    • f[i]=max(f[i-1],prices[i]-min_prices)
  • 3.初始化和边界条件
    • f[0]=0
  • 4.计算顺序
    • 从小到大
   int maxProfit(vector<int>& prices) 
{
        int min_price = prices[0];
	int n = prices.size();
	vector<int> f(n);
	f[0] = 0;

	for (int i = 1; i < n; i++) {//注意这里是从1开始
		min_price = min(min_price, prices[i]);
		f[i] = max(f[i - 1], prices[i] - min_price);
	}

	return f[n-1];

}

【方法三:暴力法】

int maxProfit(vector<int>& prices) {
	int res = INT_MIN;
	for (int i = 0; i < prices.size(); i++) 
	{
		for (int j = i + 1; j < prices.size(); j++) {
			if (prices[j] > prices[i]) {//卖出价格必须必买入价格贵
				res = max(prices[j] - prices[i], res);
			}
		}
	}
	if (res == INT_MIN)res=0;
	return res;
}

该方法在牛客上可以通过,但是在leetcode上超过了时间限制

猜你喜欢

转载自blog.csdn.net/qq_39328436/article/details/112688459