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

## 题目描述

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 at most two transactions.

## 解题思路

max=max<formmer[i]+latter[i]?fommer[i]+latter[i]:max$max = max < formmer[i] + latter[i] ? fommer[i] + latter[i] : max$

ps: 2015年小米春季实习生招聘在线笔试第二题就是这个题，不过当时我没刷这个题，但是还是做出来啦～

2015/8/12更新

## 算法描述

1. 遍历，计算出第x天之前一次交易可以得到的最大收益，存储在formmer[n]中
2. 遍历，计算出第x天之后一次交易可以得到的最大收益，存储在latter[n]中
3. 遍历，计算formmer[i] + latter[i] 得到最大收益max

## 代码 C

/**
* 计算最大收益
* @param prices : 每日价格
* @param pricesDize : 数据规模
* @return : 最大收益
* @note : 至多进行两次买卖
*/
int maxProfit(int* prices, int pricesSize) {
/* 如果价格数据为空或只有一个数据，返回0  */
if (pricesSize <= 1) return 0;

int *maxProfitDuringFormmerDays = (int *)malloc(sizeof(int) * pricesSize),
*maxProfitDuringLatterDays = (int *)malloc(sizeof(int) * pricesSize);

int day, diff, minPrice, maxPrice, maxProfit;

/* 计算某一天极其之前所有时间内的最大利益  */
minPrice = *prices;
maxProfit = 0;
*maxProfitDuringFormmerDays = 0;
for (day = 1; day < pricesSize; ++day) {
diff = *(prices + day) - minPrice;
if (diff < 0) minPrice = *(prices + day);
else if (diff > maxProfit) maxProfit = diff;
*(maxProfitDuringFormmerDays + day) = maxProfit;
}

/* 计算某一天极其之后所有时间内价格的最利益  */
maxPrice = *(prices + pricesSize - 1);
maxProfit = 0;
*(maxProfitDuringLatterDays + pricesSize - 1) = 0;
for (day = pricesSize - 2; day > -1; --day) {
diff = maxPrice - *(prices + day);
if (diff < 0) maxPrice = *(prices + day);
else if (diff > maxProfit) maxProfit = diff;
*(maxProfitDuringLatterDays + day) = maxProfit;
}

/* 计算最大收益 */
int sum;
maxProfit = 0;
for (day = 0; day < pricesSize; ++day) {
sum = *(maxProfitDuringFormmerDays + day) + *(maxProfitDuringLatterDays + day);
if (sum > maxProfit) maxProfit = sum;
}

free(maxProfitDuringFormmerDays);
free(maxProfitDuringLatterDays);

return maxProfit;
}

## 代码 CPP

class Solution {
public:
/**
* 计算最大收益
* @param prices : 每日价格
* @return : 最大收益
* @note : 至多进行两次买卖
*/
int maxProfit(vector<int>& prices) {
int pricesSize = prices.size();

/* 如果价格数据为空或只有一个数据，返回0  */
if (pricesSize <= 1) return 0;

vector<int> maxProfitDuringFormmerDays(pricesSize),
maxProfitDuringLatterDays(pricesSize);

int day, diff, minPrice, maxPrice, maxProfit;

/* 计算某一天极其之前所有时间内的最大利益  */
minPrice = prices[0];
maxProfit = 0;
maxProfitDuringFormmerDays[0] = 0;
for (day = 1; day < pricesSize; ++day) {
diff = prices[day] - minPrice;
if (diff < 0) minPrice = prices[day];
else if (diff > maxProfit) maxProfit = diff;
maxProfitDuringFormmerDays[day] = maxProfit;
}

/* 计算某一天极其之后所有时间内价格的最利益  */
maxPrice = prices[pricesSize - 1];
maxProfit = 0;
maxProfitDuringLatterDays[pricesSize - 1] = 0;
for (day = pricesSize - 2; day > -1; --day) {
diff = maxPrice - prices[day];
if (diff < 0) maxPrice = prices[day];
else if (diff > maxProfit) maxProfit = diff;
maxProfitDuringLatterDays[day] = maxProfit;
}

/* 计算最大收益 */
int sum;
maxProfit = 0;
for (day = 0; day < pricesSize; ++day) {
sum = maxProfitDuringFormmerDays[day] + maxProfitDuringLatterDays[day];
if (sum > maxProfit) maxProfit = sum;
}

return maxProfit;
}

};

## 运行情况

Lauguage Status Time
c Accept 4ms
cpp Accept 12ms

2015/7/8

• 本文已收录于以下专栏：

## 【LeetCode】 Best Time to Buy and Sell Stock I II III IV 解题报告

Best Time to Buy and Sell Stock I题意：用一个数组表示股票每天的价格，数组的第i个数表示股票在第i天的价格。 如果只允许进行一次交易，也就是说只允许买一支股票并卖掉，求...
• ljiabin
• 2015年04月06日 11:10
• 21792

## Best Time to Buy and Sell Stock III -- LeetCode

• linhuanmars
• 2014年04月09日 05:34
• 27302

## LeetCode--Best Time to Buy and Sell Stock III (动态规划）

LeetCode--Best Time to Buy and Sell Stock III (动态规划） 动态规划，最大m字段和
• mason_mow
• 2014年05月28日 11:07
• 1080

## 关于LeetCode中Best Time to Buy and Sell Stock一题的理解

• zsy112371
• 2016年09月09日 13:55
• 832

## LeetCode123:Best Time to Buy and Sell Stock III

Say you have an array for which the ith element is the price of a given stock on day i. Design an a...
• u012501459
• 2015年06月16日 09:54
• 1513

## 【leetcode】123. Best Time to Buy and Sell Stock III

• zone_programming
• 2015年07月22日 19:09
• 631

## leetcode123 Best Time to Buy and Sell Stock III

• MMChinaMM
• 2015年11月06日 21:43
• 1336

## leetCode练习（123）

• u010771890
• 2016年11月04日 10:07
• 192

## LeetCode | Best Time to Buy and Sell Stock III

Say you have an array for which the ith element is the price of a given stock on day i. Design an a...
• u013033845
• 2016年08月25日 11:19
• 184

## LeetCode: Best Time to Buy and Sell Stock III [123]

【题目】 Say you have an array for which the ith element is the price of a given stock on day i. Desig...
• HarryHuang1990
• 2014年06月22日 18:27
• 717

举报原因： 您举报文章：Leetcode 123 Best Time to Buy and Sell Stock III 至多两次买卖股票最大收益 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)