day35
860.柠檬水找零
题目链接:860. 柠檬水找零
解题思路:自己做直接AC了
针对遇到5,10,20时候的情况分类讨论,对应变量做加或者减操作即可
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
int num5 = 0;
int num10 = 0;
for( int i = 0; i < bills.size(); i++){
if( bills[i] == 5 ){
num5 +=1;
}
else if( bills[i] == 10){
num10 += 1;
num5 -= 1;
}
else if( bills[i] == 20 ){
// num10 -= 1;
if(num10 > 0){
num10 -= 1;
num5 -= 1;
}
else{
num5 -= 3;
}
}
if( num5 < 0 || num10 < 0){
return false;
}
}
return true;
}
};
406.根据身高重建队列
题目链接:406. 根据身高重建队列
本题有两个维度,h和k,一定要先确定一个维度,在确定另外一个维度
先排身高再排数量
局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性
全局最优:最后都做完插入操作,整个队列满足题目队列属性
class Solution {
public:
// 定义cmp函数需要加上static
static bool cmp( const vector<int>& a, const vector<int>& b){
if( a[0] == b[0]) return a[1] < b[1];
return a[0] > b[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort( people.begin(),people.end(),cmp);
// vector<vector<int>> que;
// 注意list插入和vector插入的区别
list<vector<int>> que;
for( int i = 0; i < people.size(); i++){
int position = people[i][1];
// que.insert( que.begin() + position,people[i]);
std::list<vector<int>>::iterator it = que.begin();
while( position--){
it++; //寻找插入位置
}
que.insert(it,people[i]);
}
return vector<vector<int>>(que.begin(),que.end());
}
};
// list插入效率更高
贪心算法:根据身高重建队列(续集) 针对vector和list讲解
vector和list的区别:插入使用list效率较高
// vector插入
vector<vector<int>> que;
que.insert( que.begin() + position,people[i]);
// list插入
std::list<vector<int>>::iterator it = que.begin();
while( position--){
it++; //寻找插入位置
}
que.insert(it,people[i]);
vector<vector<int>>(que.begin(),que.end());
452.用最少数量的箭引爆气球
题目链接:452. 用最少数量的箭引爆气球
局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。
class Solution {
public:
static bool cmp( vector<int>& a, vector<int>& b){
if( a[0] == b[0]) return a[1] < b[1];
return a[0] < b[0];
}
int findMinArrowShots(vector<vector<int>>& points) {
if( points.size() == 0) return 0;
sort( points.begin(),points.end(),cmp);
int result = 1;
for( int i = 1; i < points.size(); i++){
if( points[i][0] > points[i-1][1]){
result++;
}else{
points[i][1] = min(points[i][1],points[i-1][1]);
}
}
return result;
}
};