列表

详情


BM81. 买卖股票的最好时机(二)

描述

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

数据范围:
要求:空间复杂度 ,时间复杂度
进阶:空间复杂度 ,时间复杂度

示例1

输入:

[8,9,2,5,4,7,1]

输出:

7

说明:

在第1天(股票价格=8)买入,第2天(股票价格=9)卖出,获利9-8=1 在第3天(股票价格=2)买入,第4天(股票价格=5)卖出,获利5-2=3 在第5天(股票价格=4)买入,第6天(股票价格=7)卖出,获利7-4=3 总获利1+3+3=7,返回7

示例2

输入:

[5,4,3,2,1]

输出:

0

说明:

由于每天股票都在跌,因此不进行任何交易最优。最大收益为0。

示例3

输入:

[1,2,3,4,5]

输出:

4

说明:

第一天买进,最后一天卖出最优。中间的当天买进当天卖出不影响最终结果。最大收益为4。

原站题解

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

C++ 解法, 执行用时: 13ms, 内存消耗: 3208KB, 提交时间: 2022-06-29

static const auto io_sync_off = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算最大收益
     * @param prices int整型vector 股票每一天的价格
     * @return int整型
     */
    int maxProfit(vector<int>& prices) {
        int sumdiff = 0;
        for(int i=0; i<prices.size()-1; ++i){
            int diff = prices[i+1] - prices[i];
            if(diff > 0){
                sumdiff += diff;
            }
        }
        return sumdiff;
    }
};

C++ 解法, 执行用时: 13ms, 内存消耗: 3212KB, 提交时间: 2022-05-29

static const auto io_sync_off = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();

        // dp[i][0]: 表示第i天交易结束后没有股票所获得的最大利润
        // dp[i][1]: 表示第i天交易结束后持有股票所获得的最大利润
        int dp_i0 = 0, dp_i1 = 0;

        // base case
        int tmp_i0 = 0, tmp_i1 = -prices[0];

        /*
         * 状态转移方程:
         *   dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i])
         *   dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1])
         * */
        for (int i = 1; i < n; i++) {
            dp_i0 = max(tmp_i0, tmp_i1 + prices[i]);
            dp_i1 = max(tmp_i0 - prices[i], tmp_i1);

            tmp_i0 = dp_i0;
            tmp_i1 = dp_i1;
        }

        return max(dp_i0, dp_i1);
    }
};

C++ 解法, 执行用时: 13ms, 内存消耗: 3224KB, 提交时间: 2022-06-18

const auto io_sync_off = [] () {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    return nullptr;
}();

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算最大收益
     * @param prices int整型vector 股票每一天的价格
     * @return int整型
     */
    int maxProfit(vector<int>& prices) {
        // write code here
        int n = prices.size();
        int ans = 0;
        for (int i = 1; i < n; i++) {
            int a = prices[i] - prices[i - 1];
            if (a > 0) {
                ans += a;
            }
        }
        return ans;
    }
};

C++ 解法, 执行用时: 13ms, 内存消耗: 3240KB, 提交时间: 2021-07-29

const auto io_sync_off=[]()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算最大收益
     * @param prices int整型vector 股票每一天的价格
     * @return int整型
     */
    int maxProfit(vector<int>& prices) {
        // write code here
        int sum = 0;
        if(prices.size()<2)
        {
            return 0;
        }
        int bofeng = 0, bogu = 0;
        if (prices.at(0) < prices.at(1))//初始为波谷
            bogu = prices.at(0);
        if (prices.at(0) > prices.at(1))//初始为波峰
            bofeng = prices.at(0);
        if (prices.at(0) == prices.at(1))
        {
            bofeng = bogu = prices.at(0);
        }
        for (int i = 1; i < prices.size() - 1; i++)
        {
            if (prices.at(i) <= prices.at(i + 1) && prices.at(i) <= prices.at(i - 1))//找到波谷
            {
                bogu = prices.at(i);
            }
            if (prices.at(i) >= prices.at(i + 1) && prices.at(i) >prices.at(i - 1))//找到波峰
            {
                bofeng = prices.at(i);
                //if (bofeng != bogu)
                    sum += bofeng - bogu;
            }
        }
        if (prices.at(prices.size() - 1) > prices.at(prices.size() - 2))
        {
            bofeng = prices.at(prices.size() - 1);
            sum += bofeng - bogu;
        }
        return sum;
    }
};

C++ 解法, 执行用时: 13ms, 内存消耗: 3252KB, 提交时间: 2022-06-16

static const auto io_sync_off = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
   /**
    * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    * 计算最大收益
    * @param prices int整型vector 股票每一天的价格
    * @return int整型
    */
   int maxProfit(vector<int>& prices) {
       int ans = 0;
       for (int i = 1; i < prices.size(); i++)
       {
           if (prices[i] - prices[i - 1] > 0)
               ans += prices[i] - prices[i - 1];
       }
       return ans;
   }
};

上一题