首页 > 编程语言 >贪心算法part01

贪心算法part01

时间:2024-12-03 23:31:47浏览次数:5  
标签:饼干 prediff part01 峰值 int 算法 result 最优 贪心

文章参考来源代码随想录

贪心算法:局部最优到全局最优

455.分发饼干

这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩

可以尝试使用贪心策略,先将饼干数组和小孩数组排序

然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(),g.end());
        sort(s.begin(),s.end());
        int result=0;
        int index=s.size()-1;
        for(int i=g.size()-1;i>=0;i--){
            if(index>=0&&s[index]>=g[i]){
                result++;
                index--;
            }
        }
        return result;
    }
};

用了一个 index 来控制饼干数组的遍历(以此标记取过的饼干),遍历饼干并没有再起一个 for 循环,而是采用自减的方式,这也是常用的技巧。 

376. 摆动序列

局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值。其实这里不用删除,只需要记录个数就行了。

整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列。

前峰值,当前峰值;

峰值时计数器+1。

情况一:上下坡中有平坡

这里规定删除左边的节点,因此判断峰值条件就变为(prediff>=0&&curdiff<0)||(prediff<=0&&curdiff>0)

那么 当 prediff = 0 && curdiff < 0 也要记录一个峰值,因为他是把之前相同的元素都删掉留下的峰值。

情况二:数组首尾两端

题目中说了,如果只有两个不同的元素,那摆动序列也是 2。

因为我们在计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i])的时候,至少需要三个数字才能计算,而数组只有两个数字。

这里我们可以写死,就是 如果只有两个元素,且元素不同,那么结果为 2。

之前我们在 讨论 情况一:相同数字连续 的时候, prediff = 0 ,curdiff < 0 或者 >0 也记为波谷。

那么为了规则统一,针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即 preDiff = 0,如图:

376.摆动序列1

针对以上情形,result 初始为 1(默认最右面有一个峰值),此时 curDiff > 0 && preDiff <= 0,那么 result++(计算了左面的峰值),最后得到的 result 就是 2(峰值个数为 2 即摆动序列长度为 2)

情况三:单调坡度有平坡

 我们只需要在 这个坡度 摆动变化的时候,更新 prediff 就行,这样 prediff 在 单调区间有平坡的时候 就不会发生变化,造成我们的误判。就是把prediff=curdiff;提到if中。

53. 最大子序和

局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。

全局最优:选取最大“连续和”。

count记为连续和,结果为result。

当结果小于连续和时,后者赋给前者;(本质是不断确定区间结束位置)

当连续和为负时,重置连续和;(本质是不断确定区间开始位置)

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int result=INT_MIN;
        int count=0;
        for(int i=0;i<nums.size();i++){
            count+=nums[i];
            if(result<count)result=count;
            if(count<=0)count=0;
        }
        return result;
    }
};

标签:饼干,prediff,part01,峰值,int,算法,result,最优,贪心
From: https://blog.csdn.net/2403_88990400/article/details/144225232

相关文章

  • 回溯算法 part04
    文章参考来源代码随想录491.递增子序列在90.子集II (opensnewwindow)中我们是通过排序,再加一个标记数组来达到去重的目的。而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。所以不能使用之前的去重逻辑!1.递归函数参数输入的数组,当前层开始递......
  • 【推荐算法】推荐系统的评估
    这篇文章是笔者阅读《深度学习推荐系统》第五章推荐系统的评估的学习笔记,在原文的基础上增加了自己的理解以及内容的补充,在未来的日子里会不断完善这篇文章的相关工作。离线评估在离线环境中利用已有的数据划分训练集和测试集对模型进行评估划分数据集方法机器学习常用划......
  • 每日一道算法题之并查集之移除最多的同行或同列石头
    importjava.util.HashMap;classSolution{publicstaticHashMap<Integer,Integer>row=newHashMap<>();publicstaticHashMap<Integer,Integer>col=newHashMap<>();publicstaticintMAXN=1001;publicstati......
  • 【恐怖の算法】 扫描线
    【恐怖の算法】扫描线引入扫描线一般运用在图形上面,它和它的字面意思十分相似,就是一条线在整个图上扫来扫去,它一般被用来解决图形面积,周长,以及二维数点等问题。二维矩形面积并问题在二维坐标系上,给出多个矩形的左下以及右上坐标,求出所有矩形构成的图形的面积。过程根据图片......
  • c语言顺序结构,算法,输出与输入
    ......
  • 基于MIMO系统的PE-AltMin混合预编码算法matlab性能仿真
    1.算法仿真效果matlab2022a仿真结果如下(完整代码运行后无水印):  仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要       在现代无线通信系统中,多输入多输出(Multiple-InputMultiple-Output,MIMO)技术是提高频谱效率和数据传输速率的关键。然而......
  • 数据结构与算法
    一、引言数据结构与算法是计算机科学中的基础概念,它们相互依存,共同构成了计算机程序设计和问题解决的基础。数据结构定义了数据的组织方式,而算法则是解决问题的步骤。选择合适的数据结构可以提高算法的效率,而高效的算法则需要合适的数据结构来支撑。本文将详细介绍数据结构与......
  • 前端必须掌握的16道基础算法
    前端必须掌握的16道基础算法如果对各位老师有用,欢迎点赞评论。(#^.^#)1.求字符串中最长无重复字符串长度(求长度和不重复字符串)//第一题答案:求字符串中最长无重复字符串的长度start//Math.max.apply(this,itemNum)调用Math的max方法‘继承’const......
  • 搞定leetcode面试经典150题之哈希算法
    系列博客目录搞定leetcode面试经典150题之哈希算法搞定leetcode面试经典150题之双指针搞定leetcode面试经典150题之滑动窗口文章目录系列博客目录理论知识1.哈希函数(HashFunction)2.哈希表(HashTable)通过HashMap实现3.哈希算法的应用4.哈希算法的时间复杂度编......
  • 智慧工地算法视频分析服务器安全帽安全服检测:安防设备中的网络参数都分别代表什么?
    在探讨视频智能分析系统的广泛应用于网络安防设备的核心参数时,不可避免地要深入了解其背后的技术支撑与配置细节。这一系统,凭借其强大的视频接入与查看、智能分析、任务调度等功能,已经在工厂、工地、社区等多个场景中展现出了卓越的性能与价值。而网络安防设备,作为这一系统的基石,......