买卖股票的最佳时机 II

买卖股票的最佳时机 II

题目链接

贪心算法

根据题意,给出每天股票的价格,利用贪心算法思想,可以将当天和前一天的价格差,然后取大于零的差的和,就是所能获取的最大利润。可以使用折线图帮助理解,每一点代表每一天都卖出前一天的,然后买入当天的,然后只取上升的部分即可。
在这里插入图片描述

c++解法

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int res=0;
        for(int i=0;i<prices.size()-1;i++)
            res+=max(0,prices[i+1]-prices[i]);
        return res;
    }
};

java解法

class Solution {
    public int maxProfit(int[] prices) {
        int res=0;
        for(int i=0;i<prices.length-1;i++)
            res+=Math.max(0,prices[i+1]-prices[i]);
        return res;
    }
}

python解法

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        res=0
        for i in range(len(prices)-1):
            res+=max(0,prices[i+1]-prices[i])
        return res

动态规划解法

动态规划法要根据前面的状态逐步推算出后面每一步的状态,从而得到最后的结果。本题使用动态规划解法首先要分析每天股票的状态,有两种:买入和卖出。创建dp[i][j]数组,i表示每一天,j表示每天买入卖出的状态,买入用1表示,卖出用0表示,然后写出状态转移方程,填充dp数组。注意:卖出会得到利润,买入会损失利润。

今天状态为卖出的最大利润=max(前一天没卖的最大利润+今天卖出的价格,前一天就卖了的最大利润)
dp[i][0]=max(d[i-1][1]+prices[i],d[i-1][0])
今天状态为买入的最大利润=max(前一天没买的最大利润-今天买入的价格,前一天就买入了的最大利润)
dp[i][1]=max(dp[i-1][0]-prices[i],dp[i-1][1])

c++解法

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len=prices.size();
        int dp[len][2];
        //设置初始值状态
        dp[0][0]=0;//第一天卖出为利润为0
        dp[0][1]=-prices[0];//第一天买入利润应该为-prices[0],因为这一天最初利润为0
        //填充dp数组
        for(int i=1;i<len;i++){
            dp[i][0]=max(dp[i-1][1]+prices[i],dp[i-1][0]);
            dp[i][1]=max(dp[i-1][0]-prices[i],dp[i-1][1]);
        }
        //返回最后结果
        return dp[len-1][0];//卖出肯定比买入状态的利润高,所以最后返回0状态
    }
};

java解法

class Solution {
    public int maxProfit(int[] prices) {
        int len=prices.length;
        int[][] dp=new int[len][2];
        //初始化状态
        dp[0][0]=0;
        dp[0][1]=-prices[0];
        //填充dp数组
        for(int i=1;i<len;i++){
            dp[i][0]=Math.max(dp[i-1][1]+prices[i],dp[i-1][0]);
            dp[i][1]=Math.max(dp[i-1][0]-prices[i],dp[i-1][1]);
        }
        //返回结果
        return dp[len-1][0];
    }
}

python解法

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        l=len(prices)
        #创建dp数组
        dp=[[0,0]]*l
        #初始化状态
        dp[0][0]=0
        dp[0][1]=-prices[0]
        #填充dp数组
        for i in range(1,l):
            dp[i][0]=max(dp[i-1][1]+prices[i],dp[i-1][0])
            dp[i][1]=max(dp[i-1][0]-prices[i],dp[i-1][1])
        #返回结果
        return dp[l-1][0]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值