(C语言)LeetCode--初级算法之买卖股票的最佳时机Ⅱ(贪心算法)

本文介绍了一种通过算法计算股票买卖最佳时机的方法,旨在帮助投资者最大化利润。文章提供了三种不同的贪心算法实现,包括详细的伪代码,帮助读者理解如何在给定股票价格序列的情况下做出最优的买卖决策。

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

买卖股票的最佳时机 II
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

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

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

示例 1:

输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
示例 2:

输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

提示:
1 <= prices.length <= 3 * 10 ^ 4
0 <= prices[i] <= 10 ^ 4

解法一、贪心算法
如果没有股票,明天涨,那么买入,sum减今天的股票价格.
如果没有股票,明天跌,那么不操作.
如果有股票,明天跌,那么卖出,sum加上今天的股票价格.
如果有股票,明天涨,那么不操作.
如果有股票,最后一天,那么卖出,sum加上最后一天的价格.
解法二、贪心算法2(贪心算法1改进版)
今天持股票 :如果明天涨,继续持有不卖,如果明天跌,今天卖出,不持有
今天不持有股票: 如果明天涨,今天买入,如果明天跌,继续不持有
解法三、贪心算法3
如果明天涨,利润=prices[明天]-prices[今天]

方法一:贪心算法1

int maxProfit(int* prices, int pricesSize)
{
    int state = 0,sum = 0;//state =0表明未买入股票
    for(int i = 0;i<pricesSize -1;i++)
    {
        if(prices[i] < prices[i+1])
        {
            if(state == 0)
{
sum =  sum - prices[i];
state = 1;
}
        }
        if(prices[i] > prices[i+1])
        {   
            if(state == 1)
            {
              sum = sum + prices[i];
               state = 0;   
            }
        }
if( (i + 1) ==pricesSize-1)
{
if(state == 1)
sum = sum + prices[i+1];
}
    }
    return sum;
}

方法二:贪心算法2

int maxProfit(int* prices, int pricesSize) {
    if(pricesSize<2)
        return 0;
	int res = 0;//收益
	int cur = 0;//1:持有股票,0: 不持有
	for (int i = 0; i < pricesSize - 1; i++)
	{
			//卖出:如果持有,且明天股票跌(第1天不能卖,第一天cur=0)
		if (cur ==1 && (prices[i] > prices[i + 1])) {
			res += prices[i];
			cur = 0;
		}
		//买入: 如果没有股票,且明天股票涨(最后一天不能买)
		else if (cur == 0 && (prices[i + 1] > prices[i])) {
			res -= prices[i];
			cur = 1;
		}	
	}
    return cur?(res+prices[pricesSize-1]):res;
}

方法三:贪心算法3

int maxProfit(int* prices, int pricesSize) {
    int sum = 0;
    for (int i = 0; i < pricesSize-1; i++)
    {
        if (prices[i + 1] > prices[i])
            sum += (prices[i + 1] - prices[i]);
    }
    return sum;
}

算法1:
在这里插入图片描述
算法2:
在这里插入图片描述
算法3
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值