我在tradeTest.cpp中有这样的东西
int main() {
vector<int> prices{38, 28, 30, 38, 34};
int profit = bestProfit(prices.begin(), prices.end());
if (profit == 10) {
cout << "Profit of 10 is correct\n";
} else {
cout << "Profit of " << profit << " is incorrect\n";
}
}
目前在trade.h中。
template <class Iterator>
int Profit (Iterator begin, Iterator end)
{
}
我想做的是低买高卖而不回头。
谢谢你的帮助。
答案 0 :(得分:2)
通过添加int max = 0
参数:
template <class Iterator>
int bestProfit (Iterator begin, Iterator end, int max = 0)
{
if(begin==end)
{
return max;
}else
{
int p = *std::max_element(begin+1, end) - *begin;
max = std::max(max, p);
return bestProfit(begin+1, end, max);
}
}
int main() {
vector<int> prices{28, 18, 20, 26, 24};
int profit = bestProfit(prices.begin(), prices.end());
if (profit == 8) {
cout << "Profit of 8 is correct\n";
} else {
cout << "Profit of " << profit << " is incorrect\n";
}
}
答案 1 :(得分:1)
<击> 正如我在评论中建议的那样,您可能想要做这样的事情。对不起,我现在无法测试,没有保证!
template <class Iterator>
int bestProfit (Iterator begin, Iterator end)
{
int profit = 0;
for(;begin!=end; ++begin){
int p = *std::max_element(begin+1, end) - *begin;
profit = std:max(profit, p);
}
return profit;
}
使用递归函数也可以非常优雅,如评论中的某处所示。
上面的代码可能会跳过最后一次循环迭代,想一想。如果两个输入迭代器都相同,那么std::max_element
会返回什么?
击>
你已经有了一个工作和接受的答案,但为了完整起见(我想我这样顽固)这里是我的递归函数的版本。这没有任何显式循环,但是std::max_element
内部有一个循环,而递归函数是一种编写循环的方法。没有循环就无法访问矢量或列表中的所有元素!
#include <vector>
#include <algorithm>
#include <iostream>
// Look mama! No `for`!
template <class Iterator>
int bestProfit (Iterator begin, Iterator end)
{
int buy = *begin;
++begin;
if (begin == end) return 0; // no profit to be had
int sell = *std::max_element(begin, end);
int profit = sell - buy; // max profit if we buy now
return std::max(profit, bestProfit(begin, end)); // will we do better if we wait?
}
int main() {
std::vector<int> prices1{38, 28, 30, 38, 34};
if (bestProfit(prices1.begin(), prices1.end()) != 10)
std::cout << "bad 1!\n";
std::vector<int> prices2{1, 2, 3, 4, 5, 0};
if (bestProfit(prices2.begin(), prices2.end()) != 4)
std::cout << "bad 2!\n";
std::vector<int> prices3{2, 3, 1, 4, 5, 0};
if (bestProfit(prices3.begin(), prices3.end()) != 4)
std::cout << "bad 3!\n";
std::vector<int> prices4{0, 1, 2, 5, 4, 3};
if (bestProfit(prices4.begin(), prices4.end()) != 5)
std::cout << "bad 4!\n";
std::vector<int> prices5{100, 200, 0, 1, 3};
if (bestProfit(prices5.begin(), prices5.end()) != 100)
std::cout << "bad 5!\n";
std::vector<int> prices6{100, 200, 0, 101, 30};
if (bestProfit(prices6.begin(), prices6.end()) != 101)
std::cout << "bad 6!\n";
}
答案 2 :(得分:0)
这是一个简单的神圣和征服算法。而且你还没有正确地描述问题,我认为排序数组是错误的。原因18-28将是最大值,但如果阵列处于该订单状态,则您无法在18处购买并在28处卖出