列表

详情


NC167. 买卖股票的最好时机(四)

描述

假设你有一个数组,长度为,其中是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
1. 你最多可以对该股票有笔交易操作,一笔交易代表着一次买入与一次卖出,但是再次购买前必须卖出之前的股票
2. 如果不能获取收益,请返回0
3. 假设买入卖出均无手续费
数据范围:





示例1

输入:

[8,9,3,5,1,3],3

输出:

5

说明:

第一天(股票价格=8)买进,第二天(股票价格=9)卖出,收益为1
第三天(股票价格=3)买进,第四天(股票价格=5)卖出,收益为2 
第五天(股票价格=1)买进,第六天(股票价格=3)卖出,收益为2 
总收益为5。

示例2

输入:

[3,2,5,0,0,3,1,4],2

输出:

7

说明:

第二天(股票价格=2)买进,第三天(股票价格=5)卖出,收益为3
第五天(股票价格=0)买进,第八天(股票价格=4)卖出,收益为4
总收益为7

示例3

输入:

[9,8,4,1],4

输出:

0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 400KB, 提交时间: 2022-01-10

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param prices int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int maxProfit(vector<int>& prices, int k) {
        // write code here
        int n = prices.size();
        if (n <= 1) {
            return 0;
        }
        k = min(n / 2, k);
        vector<int> lose(k + 1, 0);
        vector<int> get(k + 1, -prices[0]);
        for (int i = 1; i < n; ++i) {
            for (int j = 1; j <= k; ++j) {
                lose[j] = max(lose[j], get[j] + prices[i]);
                get[j] = max(get[j], lose[j - 1] - prices[i]);
            }
        }
        return lose[k];
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 404KB, 提交时间: 2021-12-29

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param prices int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int maxProfit(vector<int>& p, int k) {
        int n = p.size();
        if (n == 0 || k == 0) return 0;
        /*
        5个状态:
        1)不操作
        2)第一次购买b1
        3)第一次卖出s1
        4)第二次购买b2
        5)第二次卖出s2
        dp[i][j]代表第i天状态为j时产生的最大收益
        */
//         int b1,b2,s1,s2; // 分别维护第一次、第二次交易买卖的最大利润
//         b1 = b2 = -p[0], s1 = s2 = 0;
        vector<int> buy(k,-p[0]);
        vector<int> sell(k,0);
        for (auto i : p) {
            buy[0] = max(buy[0],-i);
            sell[0] = max(sell[0],buy[0]+i);
            for(int j = 1;j<k;j++) {
                buy[j] = max(buy[j],sell[j-1]-i);
                sell[j] = max(sell[j],buy[j]+i);
            }
        }
        
        return sell[k-1];
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 404KB, 提交时间: 2021-12-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param prices int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int maxProfit(vector<int>& prices, int k) {
        // write code here
         vector<int> buy(k+1, INT_MIN), sell(k+1, 0);
        for (auto &j:prices) {
            for (int i = 1; i <= k; i++) {
                buy[i] = max(buy[i], sell[i-1]-j);
                sell[i] = max(sell[i], buy[i]+j);
            }
        }
        return sell[k];
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 416KB, 提交时间: 2022-01-02

class Solution {
public:
    int maxProfit(vector<int>& prices, int k) {
        int n = prices.size();
//         获取数组长度
        if (n <= 1) return 0;
//         如果数组只有1天没有机会操作
        k = min(n / 2, k);
//         我们k的取值范围,根据我前面描述的
        vector<int> lose(k + 1, 0), get(k + 1, -prices[0]);
        for (int i = 1; i < n; i++) {
            for (int j = 1; j <= k; j++) {
                   lose[j] = max(lose[j], get[j] + prices[i]);
                   get[j] = max(get[j], lose[j - 1] - prices[i]);
            }
        }
        return lose[k];
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 416KB, 提交时间: 2021-11-09

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param prices int整型vector 
     * @param k int整型 
     * @return int整型
     */
    int maxProfit(vector<int>& prices, int k) {
        if(prices.empty() || k == 0)return 0;
        // write code here
        vector<int> dp(2*k);
        for(int i=0;i<k;i++){
            dp[i*2+1] = -prices[0];
        }
        for(int i=1;i<prices.size();i++){
            int preno = dp[0];
            int cur = dp[1];
            dp[1] = max(dp[1], -prices[i]);
            dp[0] = max(dp[0], cur + prices[i]);
            for(int j=1;j<k;j++){
                int tem1 = dp[j*2];
                dp[j*2] = max(dp[j*2], dp[j*2+1] + prices[i]);
                dp[j*2+1] = max(dp[j*2+1], preno - prices[i]);
                preno = tem1;
            }
        }
        
        return dp[2*k-2];
    }
};

上一题