Leetcode 122 Best Time to Buy and Sell Stock II 不限次数买卖股票最大收益

原创 2015年07月08日 22:51:15

原题地址

https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/

题目描述

Say you have an array for which the ith element is the price of a given stock on day i.
假设你有一个数组,里面记录的是每一天的股票的价格。

Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times). However, you may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
设计一个算法来计算最大收益。你可以完成任意次数的交易(即,买买股票多次)。但是你不能同时进行多次交易(即,在你买入股票之前必须卖掉手里的股票)。

解题思路

这个跟121题是同一个系列 Leetcode 121 Best Time to Buy and Sell Stock 单次买卖股票最大收益。一拿到这个题目的时候,我想到的是动态规划,结果TLE,于是我开始重新看这个题。说实话,真的看不出来,于是从网上搜了一下,原来答案如此简单。用贪心非常好做。但是我发现,贪心算法可以解决的问题,都很难去发现他是一个贪心,当知道答案后又觉得,原来这么简单。还是得加强啊。

我们可以很自然的这么想,只要后面一天的价格比前一天高,那么我们一定可以将这个差价转化为收益。这样问题变得简单起来,从第二天开始往后遍历,比较其于前一天的价格,只要后面价格大于前面一天的价格,就把差价加到收益里去。特殊的,对于[1,2,3]这组数据,我们的最大收益为1+1=2,即第一天买入,第二天卖出,收入+1,第二天买入,第三题卖出,收入+1;第二天买入卖出抵消,就相当于第一天买入,第三题卖出,收入为3-1=2。

算法描述

  1. profit = 0
  2. 从第2天开始遍历,判定当天价格是否大于前一天价格,若是,则将差价加到profit上,否则继续判定下一天,直到最后一天
  3. 返回profit

代码 C

/**
 * 计算最大收益
 * @param prices : 每天的股票价格
 * @param pricesSize : 数据规模
 * @return : 最大收益
 * @note : 可以买卖多次
 */
int maxProfit(int* prices, int pricesSize) {
    if (pricesSize <= 1) return 0;

    int max = 0, day;
    for (day = 1; day < pricesSize; ++day)
        if (*(prices + day) > *(prices + day - 1))
        max += *(prices + day) - *(prices + day - 1);

    return max;
}

完整代码https://github.com/Orange1991/leetcode/blob/master/122/c/main.c

代码 CPP

class Solution {
public:
    /**
     * 计算最大收益
     * @param prices : 每天的股票价格
     * @return : 最大收益
     * @note : 可以买卖多次
     */
    int maxProfit(vector<int>& prices) {
        int pricesSize = prices.size();
        if (pricesSize <= 1) return 0;

        int max = 0, day;
        for (day = 1; day < pricesSize; ++day)
            if (prices[day] > prices[day - 1])
            max += prices[day] - prices[day - 1];

        return max;
    }
};

完整代码https://github.com/Orange1991/leetcode/blob/master/122/cpp/main.cpp

运行情况

Lauguage Status Time
c Accept 4ms
cpp Accept 8ms

2015/7/8

版权声明:本文为博主原创文章,未经博主允许不得转载。

Leetcode 121 Best Time to Buy and Sell Stock 单次买卖股票最大收益

假设你有一个数组,里面记录的是每一天的股票的价格。 如果你至多只能完成一次交易(即,买一次股票、卖一次股票),设计一个算法来计算最大收益。...

Leetcode 123 Best Time to Buy and Sell Stock III 至多两次买卖股票最大收益

假设你有一个数组,里面记录的是每一天的股票的价格。 设计一个算法来计算最大收益。你至多可以完成两次交易...

Leetcode 122. Best Time to Buy and Sell Stock II 股票买卖2 解题报告

1 解题思想首先请看下第一个问题: Leetcode 121. Best Time to Buy and Sell Stock 股票买卖 解题报告 题目给定的数组还是一样的含义,依旧代表股票的价...
  • MebiuW
  • MebiuW
  • 2016年10月09日 10:41
  • 430

LeetCode121/122/123/188 Best Time to Buy and Sell Stock<股票> I/II/III/IIII----DP+Greedy**

一:LeetCode 121 Best Time to Buy and Sell Stock 题目: Say you have an array for which the ith element...

LeetCode 122 Best Time to Buy and Sell Stock II(股票买入卖出的最佳时间 II)

翻译话说你有一个数组,其中第i个元素表示第i天的股票价格。设计一个算法以找到最大利润。你可以尽可能多的进行交易(例如,多次买入卖出股票)。然而,你不能在同一时间来多次交易。(例如,你必须在下一次买入前...
  • NoMasp
  • NoMasp
  • 2016年03月08日 19:21
  • 4515

Best Time to Buy and Sell Stock 股票交易最大收益

主要是利用动态规划的思想解决问题。Best Time to Buy and Sell Stock I Say you have an array for which the ith element...

[LeetCode]122. Best Time to Buy and Sell Stock II(最佳买卖时间 II)

122. Best Time to Buy and Sell Stock IISay you have an array for which the ith element is the price ...

Best Time to Buy and Sell Stock II 最佳时间买入卖出股票(多次买卖)@LeetCode

package Level3; /** * Best Time to Buy and Sell Stock II * * Say you have an array for which t...

[LeetCode]121. Best Time to Buy and Sell Stock(求近期股票能获得的最大利润)

121. Best Time to Buy and Sell Stock原题链接 Say you have an array for which the ith element is the pri...

LeetCode122. Best Time to Buy and Sell Stock II题解

今天讨论一道让我想的过于复杂的题目:一道有关股票买卖的问题。题目描述:Say you have an array for which the i th element is the price of ...
  • lby0910
  • lby0910
  • 2017年04月06日 16:18
  • 301
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Leetcode 122 Best Time to Buy and Sell Stock II 不限次数买卖股票最大收益
举报原因:
原因补充:

(最多只允许输入30个字)