代码随想录第27天|贪心算法part1

455.分发饼干

在这里插入图片描述
先给孩子和饼干排序,每次选取一个最大的饼干给一个最大胃口的孩子,直到饼干分完或者遍历完孩子

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

或者换一种想法,从小到大遍历饼干,每次分配一个饼干给小朋友,能给index就++

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

376.摆动序列

在这里插入图片描述
如果只有一个元素,则答案为1
如果有两个元素,则如果两个元素不相同,答案为2,否则为1
这是需要注意的地方

本题需要绘制一个图,能看出来峰值的关系
在这里插入图片描述
只需要把那些非峰值上的点删除,就是最长的摆动序列
因为对于非峰值的点,其都是无关紧要的
当坡度发生变化时,只需要找到该坡度里的极点即可

局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值。
整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列

本题要考虑三种情况:

情况一:上下坡中有平坡
在这里插入图片描述
可以统一规则,删除前面的3个2,留下最后一个,序列变成[1,2,1],答案为3
在这里插入图片描述

当 i 指向第一个 2 的时候,prediff > 0 && curdiff = 0 ,当 i 指向最后一个 2 的时候 prediff = 0 && curdiff < 0
当 prediff = 0 && curdiff < 0 也要记录一个峰值,因为他是把之前相同的元素都删掉留下的峰值。
所以我们记录峰值的条件应该是: (preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)
那么如果选择保留第一个2,删除其余2的时候,额外的判断条件应该是prediff!=0 && curdiff=0

情况二:数组首尾两端
对于左右端点的判断情况
如果只有两个不同的元素,那摆动序列也是 2
例如序列[2,5],如果靠统计差值来计算峰值个数就需要考虑数组最左面和最右面的特殊情况。
左端点是没有prediff的,右端点没有curdiff,如果不需要写if特判的话,那么我们需要假设左端点前面有一个虚拟端点,其值和左端点是一样的,则左端点prediff=0
在这里插入图片描述
而对于右端点,我们直接假设其已经是一个峰值了(其必定为一个峰值,因为它是最后一个元素,可以画图想一下原理,要么就是极值,要么就是摆动的第一个元素),所以我们答案初始就为1
针对以上情形,result 初始为 1(默认最右面有一个峰值),对于左端点,此时 curDiff > 0 && preDiff <= 0,那么 result++(计算了左面的峰值),最后得到的 result 就是 2(峰值个数为 2 即摆动序列长度为 2)

情况三:单调坡中有平坡
我们忽略了一种情况,即 如果在一个单调坡度上有平坡
在这里插入图片描述
如果按照之前的条件
(preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)
那么在最后一个2的时候,result就会+1,这明显是不对的,因为答案应该为2->序列是[1,4]
之所以会出问题是因为prediff实时更新
我们应该在坡度变化的时候再用curdiff更新prediff,这样它记录了之前的坡度方向(大于0和小于0),这样到1的时候prediff被更新为1,表示是一个上坡,然后坡度没变化的时候prediff一直是1,到了最后一个2的时候prediff>0,curdiff>0,所以长度不会增加

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        if (nums.size() <= 1)
            return nums.size();
        int curdif = 0;
        int predif = 0;
        int res = 1;
        for (int i = 0; i < nums.size() - 1; i++) {
            curdif = nums[i + 1] - nums[i];
            if ((predif <= 0 && curdif > 0) || (predif >= 0 && curdif < 0)) {
                res++;
                // 只有坡度变化才记录
                predif = curdif;
            }
        }
        return res;
    }
};

53.最大子数组和

在这里插入图片描述
贪心
局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。

全局最优:选取最大“连续和”
局部最优的情况下,并记录最大的“连续和”,可以推出全局最优。

从代码角度上来讲:遍历 nums,从头开始用 sum 累积,如果 sum一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 sum 了,因为已经变为负数的 count,只会拖累总和。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if (nums.size() == 1)
            return nums[0];
        int sum = 0;
        int res = -INT_MAX;
        for (int i = 0; i < nums.size(); i++) {
            if (sum <= 0)
                sum = 0;
            sum += nums[i];
            res = max(res, sum);
        }
        return res;
    }
};

前缀和的做法也是可以的,用两个变量
maxsum和minprefixsum来分别记录遍历到的最大子数组和以及最小前缀和
首先计算前缀和数组,sum[0] = 0
maxsum初始化为最小的int,minprefixsum初始化为0.
从前往后依次遍历各个前缀和,记录最大的前缀和之差,将其保存在maxsum,因为前缀和之差就是区间和
同时记录最小的前缀和,因为一个后面的前缀和 sum[i]减去前面最小的前缀和minprefixsum,得到的一定是以当前数nums[i-1]为右端点的最大的区间和

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if (nums.size() == 1)
            return nums[0];
        int n = nums.size();
        vector<int> sum(n + 1, 0);
        for (int i = 0; i < nums.size(); i++) {
            sum[i + 1] = sum[i] + nums[i];
        }
        int maxsum = INT_MIN;
        int minprefixsum = sum[0];
        for (int i = 1; i <= n; i++) {
            maxsum = max(maxsum, sum[i] - minprefixsum);
            minprefixsum = min(minprefixsum, sum[i]);
        }

        return maxsum;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/688059.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

django ORM model update常规用法

Django ORM&#xff08;对象关系映射&#xff09;提供了一种强大而直观的方式&#xff0c;通过Python类和方法与数据库交互。在Django模型中更新记录是一个常见的任务&#xff0c;可以通过多种方式完成。以下是一些常见的更新记录的方法&#xff1a; 1. 更新单条记录 使用 sa…

ORA-12519 TNS:no appropriate service handler found

问题描述 jdbc连接Oracle失败&#xff0c;报错日志如下&#xff1a; Listener refused the connection with the following error: ORA-12519, TNS:no appropriate service handler found The Connection descriptor used by the client was:192.9.100.217:7001:wcm 问题分…

解决Nginx出现An error occurred问题

每个人遇到Nginx的An error occurred情况可能都不一样&#xff08;见图1&#xff09;&#xff0c;Nginx造成该错误的原因&#xff1a; 1. 我在配置域名解析成IP时&#xff0c;没有把所有解析配置都修改&#xff0c;见图2&#xff1a;解析 *.hanxiaozhang.xyz 配置的是新IP地…

Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库

Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库 目录 Python 机器学习 基础 之 【常用机器学习库】 scikit-learn 机器学习库 一、简单介绍 二、scikit-learn 基础 1、安装 scikit-learn 2、导入 scikit-learn 3、数据准备 4、数据分割 5、训练模…

将web项目打包成electron桌面端教程(二)vue3+vite+ts

说明&#xff1a;我用的demo项目是vue3vitets&#xff0c;如果是vue2/cli就不用往下看啦&#xff0c;建议找找其他教程哦~下依赖npm下载不下来的&#xff0c;基本换成cnpm/pnpm/yarn就可以了 一、项目准备 1、自己新创建一个&#xff0c;这里就不过多赘述了 2、将需要打包成…

[matlab]折线图之多条折线如何绘制实心圆作为标记点

使用MarkerFaceColor是标记点填充的颜色&#xff0c;b&#xff0c;表示blue&#xff0c;蓝色 plot(x, a, d--, MarkerFaceColor, b); % 绘制仿真结果的曲线如果一张图多条曲线那么每条曲线需要单独调用一次plot&#xff0c;每个plot间用hold on 连接 plot(x, a, d--, MarkerF…

sick0s1.1 靶机实战

sick0s1.1 信息收集 nmap存活及端口&#xff1a; nmap服务扫描&#xff1a; web 80和8080都没有开放&#xff0c;&#xff0c;无法访问&#xff0c;gobuster等工具也跑不了&#xff0c;访问一下3128试试 根据端口服务扫描也能得知这是个http的代理服务器&#xff0c;&#x…

6.6SSH的运用

ssh远程管理 ssh是一种安全通道协议&#xff0c;用来实现字符界面的远程登录。远程复制&#xff0c;远程文本传输。 ssh对通信双方的数据进行了加密 用户名和密码登录 密钥对认证方式&#xff08;可以实现免密登录&#xff09; ssh 22 网络层 传输层 数据传输的过程中是加密的 …

js解析成语法树以及还原

const {parse} require("babel/parser"); const traverse require("babel/traverse").default; const generator require("babel/generator").default;// 1.定义要处理的代码 const jscode function square(n) {return n * n; };// 2.使用ba…

逻辑过期解决缓存击穿

我先说一下正常的业务流程&#xff1a;需要查询店铺数据&#xff0c;我们会先从redis中查询&#xff0c;判断是否能命中&#xff0c;若命中说明redis中有需要的数据就直接返回&#xff1b;没有命中就需要去mysql数据库查询&#xff0c;在数据库中查到了就返回数据并把该数据存入…

恢复误删和格式化的文件的利器

一、简介 1、一款由Piriform开发的免费文件恢复工具,它能够帮助用户恢复那些不小心从电脑上删除的文件,包括从回收站清空的文件,以及因用户错误操作而从存储设备中删除的图片、音乐、文档等多种格式的文件。Recuva支持对硬盘、闪存卡、U盘等多种存储介质进行扫描与恢复,并且…

CodeMeter助力Hilscher,推动实现全球智能制造连接解决方案

Hilscher的旗舰店为开放工业4.0联盟&#xff08;OI4&#xff09;社区提供了应用商店的便捷和开放性&#xff0c;将这一概念引入工业领域。该商店依托CodeMeter的许可证管理和加密保护&#xff0c;为工业用户提供了丰富的应用和解决方案库&#xff0c;满足他们在车间自动化和连接…

【问题分析】WMS无焦点窗口的ANR问题 + transientLaunch介绍【Android 14】

问题描述 Monkey跑出的Camera发生ANR的问题&#xff0c;其实跟Camera无关&#xff0c;任意一个App都会在此场景下发生ANR&#xff0c;场景涉及到Launcher的RecentsActivity界面&#xff0c;和transientLaunch相关。 1 log分析 看问题发生的场景&#xff1a; 1、Camera App的…

python基础实例

下一个更大的数 定义一个Solution类&#xff0c;用于实现next_great方法 class Solution: def next_great(self, nums1, nums2): # 初始化一个空字典answer&#xff0c;用于存储答案 answer {} # 初始化一个空列表stack&#xff0c;用于存储待比较的数字 stack [] # 遍历nu…

RK3568技术笔记之三 SAIL-RK3568开发板板卡功能测试

从这里开始&#xff0c;就是老生常谈系列之一&#xff1a;板卡功能测试。 放一张图镇一下帖 按照我自己顺手的方式&#xff0c;把这板子功能测一下。 先把开发板串口信息打印出来。 工具 功能 备注 电脑&#xff08;必备&#xff09; 提供使用终端软件环境 需要具备至少…

《精通ChatGPT:从入门到大师的Prompt指南》第1章:认识ChatGPT

第1章&#xff1a;认识ChatGPT 1.1 ChatGPT是什么 ChatGPT&#xff0c;全称为Chat Generative Pre-trained Transformer&#xff0c;是由OpenAI开发的一种先进的自然语言处理模型。它利用了深度学习中的一种技术——Transformer架构&#xff0c;来生成类人文本。ChatGPT通过对…

计算机组成原理(一)

冯诺依曼机器的特征&#xff1a; 指令和数据以同等的地位存储在存储器当中指令和数据都是二进制指令和数据都是保存在存储器当中的 存储字 每个存储单元中的数据&#xff0c;称为存储字 存储字长 存储单元能够存储的二进制数据的长度 在一个8位系统中&#xff0c;字长是…

中学生学人工智能系列:如何用AI学政治

经常有读者朋友给公众号《人工智能怎么学》留言咨询如何使用人工智能学习语文、数学、英语等科目。这些都是中学教师、中学生朋友及其家长们普遍关注的问题。仅仅使用留言回复的方式&#xff0c;不可能对这些问题做出具体和透彻的解答&#xff0c;因此本公众号近期将推出中学生…

最大矩形问题

柱状图中最大的矩形 题目 分析 矩形的面积等于宽乘以高&#xff0c;因此只要能确定每个矩形的宽和高&#xff0c;就能计算它的面积。如果直方图中一个矩形从下标为 i 的柱子开始&#xff0c;到下标为 j 的柱子结束&#xff0c;那么这两根柱子之间的矩形&#xff08;含两端的柱…

EE trade:通货膨胀时期投资什么最好

当通货膨胀来袭&#xff0c;货币购买力下降&#xff0c;闲置资金贬值速度加快。为了有效抵御通货膨胀&#xff0c;投资者需要选择能够保值甚至增值的投资工具。以下是几种在通货膨胀环境下较为理想的投资选择&#xff1a; 1. 投资股票 收益性和风险性&#xff1a;股票虽然风险…