第二十九天 第八章 贪心算法 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;
    }
};
相关推荐
谭欣辰16 小时前
字典树:高效字符串处理利器
c++·算法
俺爱吃萝卜16 小时前
Java 性能调优实战:从 JVM 内存模型到垃圾回收算法优化
java·jvm·算法
鹿角片ljp16 小时前
LeetCode215: 数组中的第K个最大元素 —— 从快速选择到堆排
算法·排序算法
天若有情67316 小时前
用动态规划思路,一步一步实现响应式数据(从本质到落地)
算法·动态规划·代理模式
isNotNullX16 小时前
数据挖掘是什么?数据挖掘算法有哪些?
人工智能·算法·数据挖掘
剑挑星河月16 小时前
73.矩阵置零
数据结构·算法·leetcode·矩阵
MicroTech202516 小时前
MLGO微算法科技:面向大规模量子网络的通用纠错方案实现关键进展
网络·科技·算法
Rabitebla16 小时前
【C++】手撕日期类——运算符重载完全指南(含易错点+底层逻辑分析)
java·c语言·开发语言·数据结构·c++·算法·链表
做cv的小昊16 小时前
【TJU】应用统计学——第六周作业(3.3 两个正态总体参数的假设检验、3.4 非正态总体参数的假设检验、4.1 一元线性回归分析)
笔记·算法·数学建模·矩阵·回归·线性回归·学习方法
_深海凉_17 小时前
LeetCode热题100-单词拆分
算法·leetcode·职场和发展