基本概念

  • 贪心算法:求解问题时,每一步都采取基于当前环境下的最优选择
  • 贪心算法&动态规划:动态规划会记录每一步的环境和结果,方便回退;贪心算法不可回退

122. 买卖股票的最佳时机 II(easy)

方法一:峰谷法

如果我们分析图表,那么我们的兴趣点是连续的峰和谷。
image.png

  1. class Solution {
  2. public:
  3. int maxProfit(vector<int>& prices) {
  4. int i = 0;
  5. int valley = prices[0];
  6. int peak = prices[0];
  7. int maxprofit = 0;
  8. while (i < prices.size() - 1) {
  9. while (i < prices.size() - 1 && prices[i] >= prices[i + 1])
  10. i++;
  11. valley = prices[i];
  12. while (i < prices.size() - 1 && prices[i] <= prices[i + 1])
  13. i++;
  14. peak = prices[i];
  15. maxprofit += peak - valley;
  16. }
  17. return maxprofit;
  18. }
  19. };

方法二:简单的一次遍历

直接继续增加加数组的连续数字之间的差值,如果第二个数字大于第一个数字,我们获得的总和将是最大利润。

  1. class Solution {
  2. public:
  3. int maxProfit(vector<int>& prices) {
  4. int maxprofit = 0;
  5. for(int i=1;i<prices.size();i++)
  6. {
  7. maxprofit += max(prices[i]-prices[i-1],0);
  8. }
  9. return maxprofit;
  10. }
  11. };

406. 根据身高重建队列(Medium)

利用一个原理:个子矮的人相对于个子高的人是 “看不见” 的
该策略可以递归进行:

  • 将最高的人按照 k 值升序排序,然后将它们放置到输出队列中与 k 值相等的索引位置上。
  • 按降序取下一个高度,同样按 k 值对该身高的人升序排序,然后逐个插入到输出队列中与 k 值相等的索引位置上。
  • 直到完成为止。 ```cpp // list随机插值,最后再转存vector作为答案,速度快,内存占用高 class Solution { public: vector> reconstructQueue(vector>& people) {
    1. if(people.size()<=1)
    2. return people;
  1. sort(people.begin(),people.end(),[](vector<int> &a,vector<int> &b)
  2. {return a[0]>b[0]||(a[0]==b[0]&&a[1]<b[1]);});
  3. int lash_h=0;
  4. list<vector<int>> ans;
  5. for(auto p:people)
  6. {
  7. if(p[0]<=lash_h)
  8. {
  9. list<vector<int>>::iterator it = ans.begin();
  10. for(int i=0;i<p[1];i++)
  11. {
  12. it++;
  13. }
  14. ans.insert(it,p);
  15. }
  16. else
  17. {
  18. ans.push_back(p);
  19. }
  20. lash_h = p[0];
  21. }
  22. vector<vector<int>> ans_vector;
  23. for(auto a:ans)
  24. {
  25. ans_vector.push_back(a);
  26. }
  27. return ans_vector;
  28. }

}; ```