算法训练营DAY29 第八章 贪心算法 part02

134. 加油站

134. 加油站 - 力扣(LeetCode)

思路

如果总消耗大于总油量,那肯定无法完成绕圈

令rest=gas-cost;循环中累加这个rest记为curSUM;如果curSum出现负数,让start记为i+1;curSum归零,重新计数;

遍历完后如果能完成绕圈,start记录的就是答案起始位置。

cpp 复制代码
class Solution {
public:
    int curSum=0;
    int totalSum=0;
    int start=0;
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        for(int i=0;i<gas.size();i++){
            curSum+=(gas[i]-cost[i]);
            totalSum+=(gas[i]-cost[i]);
            if(curSum<0){
                start=i+1;
                curSum=0;
            }
        }
        if(totalSum<0)return -1;
        return start;
    }
};

135. 分发糖果

135. 分发糖果 - 力扣(LeetCode)

每个人都先给一个糖;然后从前往后遍历,如果右边的rating高就让右边的糖果数量等于左边糖果数量+1;再从后往前遍历,如果左边的rating高就让左边的糖果数量取max(当前左边的数量,右边的数量加1);

最后遍历一遍res求和。

cpp 复制代码
class Solution {
public:
    int candy(vector<int>& ratings) {
        vector<int> res(ratings.size(),1);
        for(int i=0;i<ratings.size()-1;i++){
            if(ratings[i+1]>ratings[i]){
                res[i+1]=res[i]+1;
            }
        }
        for(int j=ratings.size()-1;j>0;j--){
            if(ratings[j-1]>ratings[j]){
                res[j-1]=max(res[j]+1,res[j-1]);
            }
        }
        int sum=0;
        for(int k=0;k<res.size();k++)sum+=res[k];
        return sum;
    }
};

860.柠檬水找零

860. 柠檬水找零 - 力扣(LeetCode)

贪心的点在于优先使用10+5给20找零,5+5+5次之;当找零不足的时候return false;其余就继续,最后循环外return true

cpp 复制代码
class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int five=0,ten=0,twenty=0;
        for(int bill:bills){
            if(bill==5)five++;
            if(bill==10){
                if(five==0)return false;
                ten++;
                five--;
            }
            if(bill==20){
                if(ten>0&&five>0){
                    ten--;
                    five--;
                    twenty++;
                }else if(ten==0&&five>=3){
                    five-=3;
                    twenty++;
                }else return false;
            }
        }
        return true;
    }
};

406.根据身高重建队列

406. 根据身高重建队列 - 力扣(LeetCode)

cpp 复制代码
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];
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(),people.end(),cmp);
        vector<vector<int>> que;
        for(int i=0;i<people.size();i++){
            int position=people[i][1];//1即意味着position=每一个人的k元素
            que.insert(que.begin()+position,people[i]);
        }
        return que;
    }
};

按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。

所以在按照身高从大到小排序后:

局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性

全局最优:最后都做完插入操作,整个队列满足题目队列属性

相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集
码流子3 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark3 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218613 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法