第二十九天 第八章 贪心算法 part03 134. 加油站 135. 分发糖果 860.柠檬水找零 406.根据身高重建队列
134. 加油站
两种情况讨论,(容量-消耗量)的累加和小于0时不可环绕一周,反之即可,同时如果当前容量-消耗量小于0,那么当前加油站也不是加油站,往后推一站,但是我们一定能找到一个加油站作为开始加油站环绕一圈。
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int sum=0;
int cur=0;
int begin=0;
for(int i=0;i<gas.size();i++){
cur+=gas[i]-cost[i];
sum+=gas[i]-cost[i];
if(cur<0)
{
begin=i+1;
cur=0;
}
}
if(sum<0) return -1;
return begin;
}
};
135. 分发糖果
一开始我只对相邻评分进行比较,两边一起考虑一定会顾此失彼。
其中要注意一个细节,在进行反向比较时,res[i-1]=max(res[i]+1,res[i-1]);我们比相邻数目多的同时,还要同原本自己的数量相比,取较大的一个值。
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int> res(ratings.size(),1);
//从前往后
for(int i=1;i<ratings.size();i++){
if(ratings[i-1]<ratings[i]) res[i]=res[i-1]+1;
}
//从后往前
for(int i=ratings.size()-1;i>=1;i--){
if(ratings[i-1]>ratings[i]) res[i-1]=max(res[i]+1,res[i-1]);
}
int sum=0;
for(int i=0;i<res.size();i++){
sum+=res[i];
}
return sum;
}
};
860.柠檬水找零
这题相对容易,但是要考虑到,如果顾客给的是20,我们要先考虑使用10+5的方式找零钱,而不是全使用5元的零钱。
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) return false;
ten++;
five--;
}
if (bills[i]==20) {
if(ten>0 && five>0){
ten--;
five--;
}
else if(five>=3)
{
five-=3;
}
else{
return false;
}
}
}
return true;
}
};
406.根据身高重建队列
当一个题需要考虑两个维度时,我们要一个一个的考虑。
这题先考虑身高,再考虑位置。(这里需要讨论,如果我们先对位置排序,排序后确定不了最终的位置)
class Solution {
public:
static bool campare(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) {
vector<vector<int>> res;
sort(people.begin(),people.end(),campare);
for(int i=0;i<people.size();i++){
int position=people[i][1];
res.insert(res.begin()+position,people[i]);
}
return res;
}
};
原文地址:https://blog.csdn.net/m0_69189584/article/details/140171367
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!