分配问题(贪心算法)

455. 分发饼干

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        //贪心算法
        sort(g.begin(),g.end());
        sort(s.begin(),s.end());
        int child=0,cookies=0;
        while(child<g.size()&&cookies<s.size())
        {
            if(g[child]<=s[cookies])
            {
                child++;
            }
            cookies++;
        }
        return child;

    }
};

135. 分发糖果

class Solution {
public:
    int candy(vector<int>& ratings) {
        int n=ratings.size();
        if(n<2)
        {
            return n;
        }
        //每一个人都给一个糖
        vector<int> num(n,1);
        //第一次遍历 从左往右
        for(int i=1;i<n;i++)
        {
            if(ratings[i]>ratings[i-1])
            {
                num[i]=num[i-1]+1;
            }
        }
        //第二次遍历 从右到左
        for(int i =n-1;i>0;i--)
        {
            if(ratings[i]<ratings[i-1])
            {
                num[i-1]=max(num[i-1],num[i]+1);
            }
        }
        return accumulate(num.begin(),num.end(),0);

    }
};

435. 无重叠区间

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        //特殊情况 空
        if(intervals.empty())
        {
            return 0;
        }
        //按尾部进行递增排序
        sort(intervals.begin(), intervals.end(), [](const auto& u, const auto& v) {
            return u[1] < v[1];
        });
        int n=intervals.size();
        //定义尾部
        int total=1,prev=intervals[0][1];
        for(int i=1;i<n;i++)
        {
            //第二个的头部大于第一个尾部就重叠
            if(intervals[i][0]>=prev)
            {
                total++;
                prev=intervals[i][1];
            }
        }
        return n-total;

    }
};

122. 买卖股票的最佳时机 II

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n=prices.size(),ann=0;
        //从1开始
        for(int i=1;i<n;i++)
        {
            ann+=max(0,prices[i]-prices[i-1]);
        }
        return ann;

    }
};

605. 种花问题

/**
     * 贪心
     * 能种花的地方
     *  当前位置没有花
     *  前面要么没有花, 要么是边界
     *  后面要么没有花, 要么是边界
     */
class Solution {
public:
    bool canPlaceFlowers(vector<int>& flowerbed, int n) {
        int length=flowerbed.size();
        for(int i=0;i<length;i++)
        {
            //i==0&&flowerbed[i+1]==0 表明在左墙可以种花
            //flowerbed[i-1]==0&&i==length-1 表明在右墙可以种花
            if(flowerbed[i]==0&&(i==0||flowerbed[i-1]==0)&&(i==length-1||flowerbed[i+1]==0))
            {
                n--;
                flowerbed[i]=1;
            }
        }
        if(n<=0)
        {
            return true;
        }

        else
        {
            return false;
        }
  }
    
};

452. 用最少数量的箭引爆气球

class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        if(points.empty())
        {
            return 0;
        }
        //按尾部进行升序
        sort(points.begin(),points.end(),[](const vector<int>&u,const vector<int>&v)
        {
            return u[1]<v[1];
        });
        int pre=points[0][1],ans=1;
        for(const vector<int>ballon:points)
        {
            //下一个的头大于上一个的尾部 就需要再用一支箭
            if(ballon[0]>pre)
            {
                ans++;
                pre=ballon[1];
            }
        }
        return ans;

    }
};

763. 划分字母区间

class Solution {
public:
    vector<int> partitionLabels(string s) {
        int n=s.size();
        int last[26];
        for(int i=0;i<n;i++)
        {
            last[s[i]-'a']=i;
        }
        vector<int> partition;
        int start=0 ,end=0;
        for(int i=0;i<n;i++)
        {
            end=max(end,last[s[i]-'a']);
            if(end==i)
            {
                partition.push_back(end-start+1);
                start=end+1;
            }
        }
        return partition;

    }
};

406. 根据身高重建队列

class Solution {
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        //由高到低进行排序
        sort(people.begin(),people.end(),[](const vector<int> & u,const vector<int> & v)
         {
            //同高度按 第二位由小到大
            return u[0]>v[0]||u[0]==v[0]&&u[1]<v[1];
        });
       vector<vector<int>> ans;
       for(const vector<int>& person:people)
       {
           ans.insert(ans.begin()+person[1],person);
       }
       return ans;

    }
};

665. 非递减数列

class Solution {
public:
    bool checkPossibility(vector<int>& nums) {
        int n=nums.size(),cnn=0;
        for(int i=0;i<n-1;i++)
        {
            int x=nums[i],y=nums[i+1];
            if(x>y)
            {
                cnn++;
                if(cnn>1)
                {
                    return false;
                }
                if(i>0&&nums[i-1]>y)
                {
                    nums[i+1]=x;
                }
            }
        }
        return true;
        

    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值