860.柠檬水找零
思路
这道题还是挺简单的
- 给五元不需要找零,记录五块收入就行
- 给十元找五元,记录十元收入
- 给二十优先找一个十块一个五块,因为十块只能找二十的零钱;实在没有再找三个五元
代码实现
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
int five=0;
int ten=0;
for(int i=0;i<bills.size();i++){
if(bills[i]==5)five++;
if(bills[i]==10){
if(five>0){five--;ten++;}
else return false;
}
if(bills[i]==20){
if(ten>0&&five>0){five--;ten--;}
else if(five>=3)five-=3;
else return false;
}
}
return true;
}
};
406.根据身高重建队列
思路
和分发糖果一样需要分别从两端考虑顺序问题,在满足一边的情况下去满足另一边
- 先把身高从高到矮排列,这样每个人前面的所有人总比他高
- 再按每个人前面有几个人把排好序的人从前到后插入新的容器,如下图
代码实现
class Solution {
public:
static bool cmp1(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(),cmp1);
list<vector<int>> result;
for(int i=0;i<people.size();i++){
int pos=people[i][1];
result.insert(result.begin()+pos,people[i]);
}
return result;
}
};
优化代码
vector容器底层其实是数组,而用c++内的快捷函数insert进行插入时其实真正的实现逻辑不是单纯的扩展一个空间,而是在本身的大小上扩充一倍大小,再插入一个数据。
所以用list容器更方便,而list的底层逻辑为链表。
class Solution {
public:
static bool cmp1(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(),cmp1);
list<vector<int>> result;
for(int i=0;i<people.size();i++){
int pos=people[i][1];
list<vector<int>> ::iterator it=result.begin();
while(pos--){
it++;
}
result.insert(it,people[i]);
}
return vector<vector<int>>(result.begin(),result.end());
}
};
452. 用最少数量的箭引爆气球
思路
自己思考的思路:射气球重叠的地方,越多气球越好,于是想通过map实现,但是map又无法判断此重叠地方是哪几个重叠的气球,反正很麻烦。
看了卡哥思路可知,
- 直接按左边界从小到大先排序
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];
}
sort(points.begin(),points.end(),cmp);
- 然后判断前一个气球和后一个气球是否有重叠,有重叠则不需要多射箭,否则要多射一个。
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]);
}
代码实现
class Solution {
public:
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];
}
int findMinArrowShots(vector<vector<int>>& points) {
sort(points.begin(),points.end(),cmp);
int result=1;
// for(int i=0;i<points.size();i++){cout<<'['<<points[i][0]<<','<<points[i][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;
}
};
总结
能自己有思路,但不够成熟