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

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

相关推荐
会员源码网17 小时前
使用`mysql_*`废弃函数(PHP7+完全移除,导致代码无法运行)
后端·算法
木心月转码ing18 小时前
Hot100-Day10-T438T438找到字符串中所有字母异位词
算法
HelloReader19 小时前
Wi-Fi CSI 感知技术用无线信号“看见“室内的人
算法
颜酱21 小时前
二叉树分解问题思路解题模式
javascript·后端·算法
qianpeng8971 天前
水声匹配场定位原理及实验
算法
董董灿是个攻城狮1 天前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员2 天前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish2 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱2 天前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者2 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶