Day1-LeetCode刷题(贪心算法中的分配问题)

太久没有做过算法题了,今天开始进行“康复训练”。

455. Assign Cookies(easy)

原题地址
在这里插入图片描述

题目描述

  • 这道题的题意很简单,意思是说现在有孩子和饼干,你需要分饼干给孩子,其中每个孩子最多只能拿一个,每个孩子有不同的饥饿度,当孩子饥饿度小于饼干大小时,则可以把饼干分给他。
  • 输入为两个数组,一个是孩子的饥饿度,另一个是饼干大小。输出是最多能满足的孩子数量。

策略

  • 这题考虑贪心算法,首先满足饥饿度低的孩子,直到没有满足的饼干存在停止,这样可以尽可能保证剩下的饼干可以满足饥饿度更大的孩子。
    这里的贪心策略是,给剩余孩子里最小饥饿度的孩子分配最小的能饱腹的饼干。至于具体实现,因为我们需要获得大小关系,一个便捷的方法就是把孩子和饼干分别排序。这样我们就可以从饥饿度最小的孩子和大小最小的饼干出发,计算有多少个对子可以满足条件。

代码:

class Solution {
    
    
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
    
    
        sort(g.begin(),g.end());
        sort(s.begin(),s.end());
        int child=0, cookie=0;
        int g_size = g.size(), s_size = s.size();
        while(child<g_size && cookie<s_size){
    
    
            if(g[child]<=s[cookie]){
    
    
                child++;
                cookie++;
            }else{
    
    
                cookie++;
            }
        }
        return child;
    }
};

135. Candy(hard)

原题地址
在这里插入图片描述

题目描述

  • 这道题标签是hard,一开始以为会很难,但实际上发现还是蛮简单的,问题的大致意思是需要给站成一排的N个孩子发糖果,每个孩子都有一个评分。
  • 规则是:
    1、每个孩子至少发一个糖果
    2、每个评分高比旁边高的的孩子需要比旁边的孩子获得的糖果多
  • 输入是孩子的评分等级的数组,结果是最少的糖果数

策略

  • 这题同样考虑贪心算法,首先第一个规则很简单,只需要初始化一个和评分数组一样的数组,将所有元素设置为1就可以了,然后研究第二个规则,我们只需要简单的两次遍历即可:把所有孩子的糖果数初始化为1;先从左往右遍历一遍,如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的糖果数加1;再从右往左遍历一遍,如果左边孩子的评分比右边的高,且左边孩子当前的糖果数不大于右边孩子的糖果数,则左边孩子的糖果数更新为右边孩子的糖果数加1。通过这两次遍历,分配的糖果就可以满足题目要求了。这里的贪心策略即为,在每次遍历中,只考虑并更新相邻一侧的大小关系。

代码:

class Solution {
    
    
public:
    int candy(vector<int>& ratings) {
    
    
        int size = ratings.size();
        if(size<2){
    
    
            return size;
        }
        vector<int> ans(size,1);
        for(int i=1; i<size; i++){
    
    
            if(ratings[i] > ratings[i-1]){
    
    
                ans[i]  = ans[i-1]+1;
            }
        }
        for(int i=size-1;i>0;i--){
    
    
            if(ratings[i] < ratings[i-1]){
    
    
                ans[i-1] = max(ans[i-1],ans[i]+1);
            }
        }
        return accumulate(ans.begin(),ans.end(),0);
    }
};

总结

今天是“康复训练”的第一天,写的过程中,可以发现遗忘的是真的快,也认识到了自己很菜,如果没有做一些题目的话,甚至都无从下手,只会解决一些简单的循环题,希望自己可以把LeetCode题继续刷下去吧,也不求每天做很多题,但希望可以每天都做一两道,以此为勉。

猜你喜欢

转载自blog.csdn.net/Geek_/article/details/113478109