- 基本概念
- 122. 买卖股票的最佳时机 II(easy)">122. 买卖股票的最佳时机 II(easy)
- 406. 根据身高重建队列(Medium)">406. 根据身高重建队列(Medium)
基本概念
- 贪心算法:求解问题时,每一步都采取基于当前环境下的最优选择
- 贪心算法&动态规划:动态规划会记录每一步的环境和结果,方便回退;贪心算法不可回退
122. 买卖股票的最佳时机 II(easy)
方法一:峰谷法
如果我们分析图表,那么我们的兴趣点是连续的峰和谷。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int i = 0;
int valley = prices[0];
int peak = prices[0];
int maxprofit = 0;
while (i < prices.size() - 1) {
while (i < prices.size() - 1 && prices[i] >= prices[i + 1])
i++;
valley = prices[i];
while (i < prices.size() - 1 && prices[i] <= prices[i + 1])
i++;
peak = prices[i];
maxprofit += peak - valley;
}
return maxprofit;
}
};
方法二:简单的一次遍历
直接继续增加加数组的连续数字之间的差值,如果第二个数字大于第一个数字,我们获得的总和将是最大利润。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int maxprofit = 0;
for(int i=1;i<prices.size();i++)
{
maxprofit += max(prices[i]-prices[i-1],0);
}
return maxprofit;
}
};
406. 根据身高重建队列(Medium)
利用一个原理:个子矮的人相对于个子高的人是 “看不见” 的
该策略可以递归进行:
- 将最高的人按照 k 值升序排序,然后将它们放置到输出队列中与 k 值相等的索引位置上。
- 按降序取下一个高度,同样按 k 值对该身高的人升序排序,然后逐个插入到输出队列中与 k 值相等的索引位置上。
- 直到完成为止。
```cpp
// list随机插值,最后再转存vector作为答案,速度快,内存占用高
class Solution {
public:
vector
> reconstructQueue(vector >& people) { if(people.size()<=1)
return people;
sort(people.begin(),people.end(),[](vector<int> &a,vector<int> &b)
{return a[0]>b[0]||(a[0]==b[0]&&a[1]<b[1]);});
int lash_h=0;
list<vector<int>> ans;
for(auto p:people)
{
if(p[0]<=lash_h)
{
list<vector<int>>::iterator it = ans.begin();
for(int i=0;i<p[1];i++)
{
it++;
}
ans.insert(it,p);
}
else
{
ans.push_back(p);
}
lash_h = p[0];
}
vector<vector<int>> ans_vector;
for(auto a:ans)
{
ans_vector.push_back(a);
}
return ans_vector;
}
}; ```