贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
贪婪算法可解决的问题通常大部分都有如下的特性(看着还可以):
⑴ 有一个以最优方式来解决的问题。为了构造问题的解决方案,有一个候选的对象的集合。
⑵ 随着算法的进行,将积累起其它两个集合:一个包含已经被考虑过并被选出的候选对象,另一个包含已经被考虑过但被丢弃的候选对象。
⑶ 有一个函数来检查一个候选对象的集合是否提供了问题的解答。该函数不考虑此时的解决方法是否最优。
⑷ 还有一个函数检查是否一个候选对象的集合是可行的,也即是否可能往该集合上添加更多的候选对象以获得一个解。和上一个函数一样,此时不考虑解决方法的最优性。
⑸ 选择函数可以指出哪一个剩余的候选对象最有希望构成问题的解。
⑹ 最后,目标函数给出解的值。
股票(无限次交易)
假定你知道某只股票每一天价格的变动。
你最多可以同时持有一只股票。但你可以无限次的交易(买进和卖出均无手续费)。
请设计一个函数,计算你所能获得的最大收益。
示例1
输入
[5,4,3,2,1]
输出
0
说明
由于每天股票都在跌,因此不进行任何交易最优。最大收益为0。
示例2
输入
[1,2,3,4,5]
输出
4
说明
第一天买进,最后一天卖出最优。中间的当天买进当天卖出不影响最终结果。最大收益为4。
备注:
总天数不大于200000。保证股票每一天的价格在[1,100]范围内。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int ans = 0;
for(int i = 1 ; i < prices.size() ; i++)
{
if(prices[i]>prices[i-1])
{
ans+= prices[i]-prices[i-1];
}
}
return ans;
}
};