代码随想录第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;
    }
};

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

相关推荐
寻寻觅觅☆5 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
偷吃的耗子6 小时前
【CNN算法理解】:三、AlexNet 训练模块(附代码)
深度学习·算法·cnn
2013编程爱好者7 小时前
【C++】树的基础
数据结构·二叉树··二叉树的遍历
NEXT067 小时前
二叉搜索树(BST)
前端·数据结构·面试
化学在逃硬闯CS7 小时前
Leetcode1382. 将二叉搜索树变平衡
数据结构·算法
ceclar1237 小时前
C++使用format
开发语言·c++·算法
Gofarlic_OMS7 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
夏鹏今天学习了吗8 小时前
【LeetCode热题100(100/100)】数据流的中位数
算法·leetcode·职场和发展
忙什么果8 小时前
上位机、下位机、FPGA、算法放在哪层合适?
算法·fpga开发
董董灿是个攻城狮8 小时前
AI 视觉连载4:YUV 的图像表示
算法