代码随想录第29天:贪心

134. 加油站

复制代码
class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        for(int i=0;i<gas.size();i++)
        {
            int rest=gas[i]-cost[i];
            int index=(i+1)%gas.size();
            while(rest>0&&index!=i)//要剩余油量大于0才能到下一个节点,而且要判断是否回到原点
            {
                rest=rest+(gas[index]-cost[index]);
                index=(index+1)%gas.size();
            }
            if(rest>=0&&index==i)
            {
                return i;
            }

        }
        return -1;
    }
};

暴力解法,但判断那种环形循环是一般用while循环。

这道题目通过判断以每一个点为起始节点看是否能回到原点,这道题目的关键是while循环内的内容,要rest>0且index!=i,即要剩余油量大于0才能移动到下一个节点,且要判断是否回到原点,回到原点就中断循环。

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

从第一个位置开始计算,当出现油量为负数时,从开始到当前的位置结点所有都符合题意,只能从下一个节点为开始节点继续计算,因为题目中已经说了只有一个节点开始满足题意,所以肯定会出现,cursum>0的情况。

​​​​​​135. 分发糖果

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

分发糖果要分开看,在哪从左向右看,再从右向左看,这两个取一个最大值

简化代码

复制代码
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]>ratings[i-1])
            {
                res[i]=res[i-1]+1;
            }
        }
        for(int i=ratings.size()-2;i>=0;i--)
        {
            if(ratings[i]>ratings[i+1])
            {
                res[i]=max(res[i],res[i+1]+1);
            }
        }
        int sum=0;
        for(int i=0;i<res.size();i++)
        {
            sum+=res[i];
        }
        return sum;
    }
};

860. 柠檬水找零

复制代码
class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        if(bills[0]!=5)
        {
            return false;
        }
        int five=0;
        int ten=0;
        int twenty=0;
        for(int i=0;i<bills.size();i++)
        {
            if(bills[i]==5)
            {
                five++;
                continue;
            }
            else if(bills[i]==10)
            {
                if(five>=1)
                {
                    five--;
                    ten++;
                    continue;
                }
                else
                {
                    return false;
                }
            }
            else if(bills[i]==20)
            {
                if(ten>=1&&five>=1)
                {
                    five=five-1;
                    ten--;
                    twenty++;
                    continue;
                }
                else if(five>=3)
                {
                    five=five-3;
                    twenty++;
                    continue;
                }
                else
                {
                    return false;
                }

            }
        }
        return true;
    }
};

把各种情况写下来,进行判断就可以了,但是要注意,先花10元的再花5元的

406. 根据身高重建队列

复制代码
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>> res;
        for(int i=0;i<people.size();i++)
        {
            int p=people[i][1];
            res.insert(res.begin()+p,people[i]);
        }
        return res;
    }
};

对于多种维度的问题,要先确定一个维度,再思考另一个维度

相关推荐
我不会起名字32226 分钟前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
huang5791472 小时前
哈希算法的抗碰撞机制与安全性增强策略4
算法
林浩杨_3 小时前
SIGIR 2026|南京大学:Video-GAR:“通过生成 Query 来验证视频语义理解”的生成增强范式
论文阅读·人工智能·算法
Logic1013 小时前
C语言/数据结构位运算题解:异或XOR找出货船中的“独特载货量“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
Elsa️7463 小时前
算法一周刷题总结
c++·算法
小小程序猴13 小时前
深圳乘路资讯AI培训怎么样?课程靠谱吗?——一套课程可信度评估模型与实证分析
人工智能·算法
云上先途3 小时前
标签化服务适合哪些人?常见适用场景一次讲清
大数据·人工智能·算法·音视频
彧azz4 小时前
DFS与BFS:图遍历的两大核心算法
数据结构·学习·算法·深度优先·广度优先
Tisfy4 小时前
LeetCode 0836.矩形重叠:xy两方向分别看
数学·leetcode·题解·模拟
宣宣猪的小花园.4 小时前
【机器学习】损失函数与梯度下降:机器如何通过“犯错”不断变好
人工智能·算法·机器学习