代码随想录算法训练营第三十一天|贪心算法简介、455. 分发饼干、376. 摆动序列、53. 最大子数组和

代码随想录刷题03.12

贪心算法1

贪心算法简介

1.核心算法:从局部最优——>推导出全局最优

2.方法论:贪心算法是一种“以小见大”的思想,没有具体的方法套路。

3.解题思路:

1)分析题目中的单体个例是什么(for循环将全局问题转化到单体个例上);

2)分析局部最优是什么情况?(这个具体问题具体分析,体现贪心“以小见大”的思想)。

LeetCode题目

455. 分发饼干

解题思路

1.贪心算法本身并没有固定的策略,它是一种以局部最优得到整体最优的思路,仅仅是一种思路而已,具体的实现过程要依赖其他解题思路,比如数组双指针等等;

2.for循环可以将整体化为局部;

3.本题的贪心思路:用较小的饼干去满足较小胃口的孩子 或者 较大胃口的孩子用较大的饼干来满足。

4.双指针法的关键:理清楚谁是快指针(快指针走的快,其所代表的初始值是可以被遗弃的),谁是慢指针(慢指针走的慢,其所代表的初始值不会被遗弃)。

代码过程
class Solution {
public:
    int result=0;
    //int gpoint=0;
    int spoint=0;
    int findContentChildren(vector<int>& g, vector<int>& s) {
        if(s.size()==0||g.size()==0)return 0;
        sort(g.begin(),g.end());
        sort(s.begin(),s.end());
        spoint=s.size()-1;
        /*for(int i=0;i<s.size();i++)
        {
            if(gpoint<g.size()&&g[gpoint]<=s[i]){
                gpoint++;
                result++;
            }
        }*/
        for(int i=g.size()-1;i>-1;i--)
        {
            if(spoint>=0&&s[spoint]>=g[i]){
                result++;
                spoint--;
            }
        }
    return result;
    }
};

LeetCode题目

376. 摆动序列

解题思路

1.贪心算法是"以小见大",因此,在写代码时,主要从个体单例出发进行考虑,但是要注意个体单例应越详尽越好,要能完整凸显出满足全局要求的个体单例的独特特征。

2.本题最开始采用cur✖️pre<=0来作为个体单例子的判断标准,但会发现这种判断标准无法满足存在平坡的情况,即无法满足全局要求,将判断标准进一步精细化后,就可以逐渐逼近全局要求。

代码过程
class Solution {
public:
    int count=1;;
    int wiggleMaxLength(vector<int>& nums) {
        if(nums.size()==1)return count;
        int pre=0;
        for(int i=0;i<nums.size()-1;i++)
        {
            int cur=nums[i+1]-nums[i];
            if((pre>=0&&cur<0)||(pre<=0&&cur>0)){
            count++;
            pre=cur;
            }
        }
        return count;
    }
};

LeetCode题目

53. 最大子数组和

解题思路

1.贪心算法小结:用for循环制造出能满足全局要求的单体个例,如果涉及到最值问题,还要辅以一定的解题策略;

2.本题思路:

1)本题的单体个例是数组中的元素;

2)涉及到最值问题:当数组元素前面的累加和小于0时,则累加和清零,重新开始累加;最大值并不是时时更新,而是不断与累加和比较,取最大值。

代码过程
class Solution {
public:
    int result=INT_MIN;
    int count=0;
    int maxSubArray(vector<int>& nums) {
        for(int i=0;i<nums.size();i++)
        {
            count+=nums[i];
            result=result>count?result:count;
            if(count<=0)count=0;
        }
        return result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值