收益问题
题目描述:给定一个数组,数组内第i个元素放的是当天股票的价值,让你计算最大收益值。可以多次买入卖出,但同时手中只能有一支股票。
解题代码:
class Solution { public: int maxProfit(vector<int>& prices) { if (prices.size() == 0) return 0; int flag = 0, buyin = 0, profit = 0; for (int i = 0; i < prices.size() - 1; ++i) { if (prices[i] <= prices[i + 1]) { if (flag == 0) { flag = 1; buyin = prices[i]; } } else { if (flag == 1) { profit += (prices[i] - buyin); flag = 0; } } } if (!prices.empty() && flag == 1) { profit += (prices[prices.size() - 1] - buyin); } return profit; } };
代码解析:将股票的价值想象为一条波动曲线,要获得最大收益则是在曲线的每一条上升沿的最低处买入,最高处卖出,差值即为此次交易的收益值,再对所有的上升沿收益值求和,则是最大收益。
难点注意:
特别注意vector的数组下标,千万不可越界。因为每次要与后一个元素比较,所以for循环只可以小于vector.size()-1。
同时,vector.size()是一个无符号数 所以当vector为空时,vector.size()-1会报错。所以要排除空的这种情况。
如果数组的最后一天是在上升沿,则最后要在此处卖出。如果是在下降沿,则此时手中无股票,不需要卖出。
找到最大的满足数目
题目描述:给定一个数组需求量,给定一个数组满足量,找到能满足的最大需求数。
解题代码:
class Solution { public: int findContentChildren(vector<int>& g, vector<int>& s) { sort(g.begin(), g.end()); sort(s.begin(), s.end()); int i = 0, j = 0; while (i != g.size() && j != s.size()) { if (g[i] <= s[j]) { i++; j++; } else { j++; } } return i; } };
代码解析:对两个数组进行排序,然后遍历对比。
难点:使用STL中的sort方法能很好的节省代码量。