860.柠檬水找零
有如下三种情况:
情况一:账单是5,直接收下。
情况二:账单是10,消耗一个5,增加一个10
情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5
此时大家就发现 情况一,情况二,都是固定策略,都不用我们来做分析了,而唯一不确定的其实在情况三。
而情况三逻辑也不复杂甚至感觉纯模拟就可以了,其实情况三这里是有贪心的。
账单是20的情况,为什么要优先消耗一个10和一个5呢?
因为美元10只能给账单20找零,而美元5可以给账单10和账单20找零,美元5更万能!
所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。
局部最优可以推出全局最优,并找不出反例,那么就试试贪心算法!
406.根据身高重建队列
1.什么是满足队列属性?
2.list的用法:list 是一个双向链表容器,它不支持随机访问和使用 + 操作符来定位元素。(vector底层是数组实现,而list底层是链表实现)
初始化:
#include <iostream>
#include <list>
using namespace std;
int main() {
// 声明一个int类型的list
list<int> myList;
// 在list尾部添加元素
myList.push_back(1);
myList.push_back(2);
myList.push_back(3);
// 在list头部添加元素
myList.push_front(0);
// 迭代器遍历list并打印元素
for (list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {
cout << *it << " ";
}
return 0;
}
插入和删除:
std::list<int> myList = {1, 2, 3, 4};
// 在迭代器位置之前插入元素
std::list<int>::iterator it = std::find(myList.begin(), myList.end(), 3);
if (it != myList.end()) {
myList.insert(it, 99);
}
// 删除元素
myList.remove(2); // 删除所有值为2的元素
return vector<vector>(que.begin(), que.end());
3.static bool cmp(const vector& a, const vector& b)
452. 用最少数量的箭引爆气球
1.判断两个气球重叠之后,如何判断它和下面的气球是否重叠呢?
更新最小右边界