算法刷题Day31 | 455.分发饼干、376. 摆动序列、53. 最大子数组和

news2025/2/26 6:16:07

目录

  • 0 引言
  • 1 分发饼干
    • 1.1 我的解题
    • 1.2 更好的解题
  • 2 摆动序列
    • 2.1 我的解题
    • 2.2 我的错误原因(GPT分析)
    • 2.3 改进
  • 3 最大子数组和
    • 3.1 我的解题

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:算法专栏
  • 💥 标题:算法刷题Day31 | 455.分发饼干、376. 摆动序列、53. 最大子序和
  • ❣️ 寄语:书到用时方恨少,事非经过不知难!

0 引言

贪心算法一般分为如下四步:

  1. 将问题分解为若干子问题
  2. 找出适合的贪心策略
  3. 求解每一个子问题的最优解
  4. 将局部最优解堆叠成全局最优解

这个四步其实过于理论化了,我们平时在做贪心类的题目 很难去按照这四步去思考,真是有点“鸡肋”。
做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。

1 分发饼干

  • 🎈 文档讲解
  • 🎈 视频讲解
  • 🎈 做题状态:

1.1 我的解题

我的想法,遍历饼干,然后再从大到小遍历孩子的胃口。找到刚好匹配的数就结果加一,然后把这个胃口数据移除。

#include <algorithm>

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        int count = 0;

        // 先将数组排序
        sort(g.begin(), g.end());
        sort(s.begin(), s.begin());

        // 初步思考,使用两层循环遍历,先遍历饼干,再遍历胃口
        for (int i = 0; i < s.size(); i++)
        {
            for (int j = g.size()-1; j >= 0; j--)
            {
                if (s[i] < g[j])
                {
                    continue;
                }
                else
                {
                    count++;
                    g.erase(g.begin() + j);
                    break;
                }
            }
        }

        return count;
    }
};

1.2 更好的解题

只用了一个循环模拟了胃口和饼干的同时遍历。
先遍历大饼干,先满足胃口大的小孩。

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 result = 0;
        for (int i = g.size() - 1; i >= 0; i--) { // 遍历胃口
            if (index >= 0 && s[index] >= g[i]) { // 遍历饼干
                result++;
                index--;
            }
        }
        return result;
    }
};

2 摆动序列

  • 🎈 文档讲解
  • 🎈 视频讲解
  • 🎈 做题状态:

2.1 我的解题

本题难点:
是求的子序列,子序列的话是可以从原始序列中删除元素的。所以比较难判断。

下面是我的错误代码。

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        if (nums.size() == 1) return 1;
        if (nums.size() == 2 && nums[0] != nums[1]) return 2;

        int count = 2;
        int maxCount = count;
        // 此时数组个数大于等于3
        for (int i = 2; i < nums.size(); i++)
        {
            int diff1 = nums[i] - nums[i-1];
            int diff2 = nums[i-1] - nums[i-2];
            // cout << "diff1 = " << diff1 << endl;
            // cout << "diff2 = " << diff2 << endl;
            if ((diff > 0 && prevDiff < 0) || (diff < 0 && prevDiff > 0))
            {
                if (diff1 != 0 && diff2 != 0)
                {
                    count++;
                }
            }
            else
            {
                // 如果不满足则count重置为2,同时将不满足的数给删除
                //count = 2;
                nums.erase(nums.begin() + i - 1);
                i--;
            }
            maxCount = max(maxCount, count);
            cout << "count = " << count << endl;
        }

        return maxCount;
    }
};

2.2 我的错误原因(GPT分析)

您的代码试图解决的问题是寻找给定数组中最长的摆动子序列的长度。摆动序列被定义为序列中的数字交替大于和小于其前一个数字。您的实现逻辑有几个关键的缺陷和改进点:

  1. 数组修改: 您尝试通过删除不符合摆动序列条件的元素来维护摆动序列,这不仅改变了原数组,而且并不是解决这个问题的有效方法。在寻找最长摆动序列时,我们并不需要修改原数组,而是应该寻找一种方式来识别摆动序列的长度而不实际改变数组内容。

  2. 摆动序列的识别: 您的逻辑试图通过比较当前元素与前两个元素的差来确定是否构成摆动。虽然这种思路基本正确,但其实现方式过于复杂,且erase操作导致时间复杂度增加。此外,您的条件检查(diff1 == abs(diff1) && diff2 == -abs(diff2) || diff2 == abs(diff2) && diff1 == -abs(diff1))可以简化为检查diff1diff2的符号是否相反。

  3. 初始化问题: 初始的count设置为2是基于至少存在一对不同的元素。如果数组开始就有连续相等的元素,这种初始化是不准确的。

为了改进您的代码,可以采取以下策略:

  • 初始化时考虑特殊情况: 首先处理只有一个元素或所有元素都相等的情况。
  • 使用状态变量: 记录最后一次摆动是上升还是下降,而不是每次都检查三个元素。
  • 避免修改原数组: 直接通过遍历原数组来判断每一步是否构成摆动,不需要修改原数组。

下面是一个改进后的实现示例:

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        int n = nums.size();
        if (n < 2) return n;
        
        // 初始化计数器和方向
        int count = 1; // 至少有一个元素,所以从1开始计数
        int prevDiff = 0;
        
        for (int i = 1; i < n; ++i) {
            int diff = nums[i] - nums[i-1];
            if ((diff > 0 && prevDiff <= 0) || (diff < 0 && prevDiff >= 0)) {
                // 发现摆动,增加计数并更新prevDiff
                count++;
                prevDiff = diff;
            }
        }
        
        return count;
    }
};

这个实现不修改原数组,通过遍历数组一次,比较相邻元素之差来判断摆动,并且只在摆动方向发生变化时增加计数器。这种方式更为简洁且效率更高。

2.3 改进

不能将峰值删除,相当于求极值点有几个。看了视频发现有平坡的情况需要很多特殊讨论,那么可不可以直接把数据的平坡给去除呢?然后再来做题。使用遍历把相邻相同的数据给去除。

3 最大子数组和

  • 🎈 文档讲解
  • 🎈 视频讲解
  • 🎈 做题状态:

3.1 我的解题

首先明确思路:
最大和的子数组,然后每次移动记录数组和,如果遇到sum小于0,则可以直接将sum置为0,然后从后面遇到的第一个正数开始记录。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode算法——双指针篇

宫侑的发球最终进化为三刀流&#xff0c;那么我的题解也未必要循规蹈矩! 1、验证回文串 题目描述&#xff1a; 解法&#xff1a; 这题官方给的关于双指针的题解都用到了多个库函数&#xff0c;如 tolower(大写字母转小写)、isalnum(判断一个字符是否是 字母 或者 十进制数字 )…

Linux网络 基础概念

目录 背景知识 互联网的发展 局域网和广域网 网络协议栈 协议的概念 网络协议的分层 网络与操作系统的联系 网络传输的基本流程 IP地址和MAC地址 以太网通信 数据包的封装和分用 跨网段传输 背景知识 互联网的发展 计算机网络是计算机技术和通信技术相结合的产物…

蓝桥杯省赛冲刺(3)广度优先搜索

广度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;是一种在图或树等非线性数据结构中遍历节点的算法&#xff0c;它从起始节点开始&#xff0c;按层级逐步向外扩展&#xff0c;即先访问离起始节点最近的节点&#xff0c;再访问这些节点的邻居&#xff0c;然后是邻…

每日学习笔记:C++ STL算法之比较容器

本文的API 是否相等(值与排序) equal()equal(....,op) 是否相等(值)【忽略排序】 is_permutation()is_permutation(....,op) 查找两个容器内容中第一处不同的元素位置 mismatch()mismatch(....,op) 是否小于 lexicographical_compare()lexicographical_compare(....,op) 是否升…

pytest【1】

文章目录 pytest测试用例示例测试用例批量执行1、terminal执行pytest2、main代码启动 测试结果fixtures&#xff08;夹具&#xff09;创建fixtures使用fixturesfixtures共享范围 POM&#xff1a;对元素的封装复用 pytest 单selenuim的问题&#xff1a; 代码重用性元素加载延迟…

第十五届蓝桥杯测试组模拟赛两期

文章目录 功能测试一期-场景法-登录功能一期-等价类-边界值-添加用户账号输入框一期-登录-缺陷报告一期- UI自动化测试一期-单元测试-路径覆盖二期-正交法-搜索条件组合二期-测试用例二期-缺陷报告二期-自动化测试二期-单元测试-基本路径覆盖 功能测试 一期-场景法-登录功能 …

DWC-60B冲击试样低温槽

一、概述 DWC—60B型冲击试验低温槽是本公司根据GB229-2020《金属夏比缺口冲击试验方法》中对低温装置的要求而最新研制开发的压缩机制冷设备。本设备采用进口 双压缩机制冷技术&#xff0c;采用热平衡原理及循环搅拌方式&#xff0c;达到对试样的自动均匀冷却、恒温&#xff0…

4-云原生监控体系-Grafana-基本使用

1. 介绍 使用Grafana&#xff0c;您可以通过漂亮、灵活的仪表板创建、探索和共享所有数据。查询、可视化、提醒和理解您的数据&#xff0c;无论数据存储在何处。 图片出处&#xff1a; https://grafana.com/grafana/ 官方网站 2. 界面介绍 Connections 可以配置数据源&#x…

软件行业之选:CRM系统如何赋能业务增长?

“CRM系统从整合营销渠道、自动化营销流程、强化客户全周期管理、增强服务能力、完善企业内部流程、开展数字化决策六个方面赋能软件行业。” 软件行业由于存在较高的技术壁垒&#xff0c;很多时候销售与客户沟通不顺畅&#xff0c;实施与客户沟通有难度&#xff0c;售后服务周…

国税发票查验接口、电子增值税发票查验接口、数电票查验接口

翔云发票查验接口支持增值税发票管理系统开具发票的真伪&#xff0c;通过发票代码、号码、日期、金额、校验码四要素信息进行真伪的查验&#xff0c;支持返回全票面信息&#xff0c;API接口便于集成&#xff0c;可适用于多种应用场景。 发票查验接口python调用示例&#xff1a;…

D. Yet Another Palindrome Problem另一个回文问题

**思路:**直接找俩一样的数字看看他们中间是否存在大于等于1个数的情况 #include<iostream> #include<algorithm> #include<map> using namespace std; long long T,n,sum; int arr[6005]; map<int, int>mm; int main() {cin >> T;while (T--){…

vue实现海康h5player问题汇总

1. 引入问题 最开始写的时候&#xff0c;把h5player封装成了一个组件&#xff0c;把资源文件随便放在了一个目录下&#xff0c; 直接在子组件中引入&#xff0c;报错window.JSPlugin is not a constructor 或者JSPlugin is not defined 初步分析应该是引入资源文件失败&#x…

[Linux 进程控制(一)] 进程等待

文章目录 1、进程等待1.1 为什么要进程等待1.2 进程等待必要性1.3 进程等待的方法1.3.1 wait方法1.3.2 waitpid方法 1.4 获取子进程的status1.5 waitpid的第三个参数options 1、进程等待 1.1 为什么要进程等待 解决子进程僵尸问题带来的内存泄漏问题。子进程将父进程交给的任…

【上海大学计算机组成原理实验报告】三、微指令系统实验

一、实验目的 了解译码器、微指令结构的基本工作原理。学习设计微指令的方法。 二、实验原理 根据实验指导书的相关内容&#xff0c;本实验所用的实验箱的微指令系统控制总线宽度为24位&#xff0c;每个地址单元宽度也为24位&#xff0c;其中微指令存储器由3片8位存储器按照…

如何在SFTP工具中使用固定公网地址远程访问内网Termux系统

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

期货开户市场是没硝烟的战场

另外&#xff0c;期货市场是没有硝烟的战场&#xff0c;《孙子兵法》、《吴子兵法》、《战略论》等兵法你最好也找来读一读。《金刚经》、《坛经》、《心经》、《道德经》等你最好也认真地学一学。我认为&#xff0c;从来没有哪个领域像金融交易领域这样充斥这么多的荒谬理论&a…

Python的基础知识学习路线2—运算符与变量类型(使用jupyter notebook进行操作:最全路线,每部分附有代码操作结果)

一、更改jupyter notebook 打开文件的位置 1、打开Anaconda Prompt终端&#xff0c;输入以下命令&#xff0c;创建配置文件&#xff1a;jupyter_notebook_config.py jupyter notebook --generate-config2、打开生成的配置文件 3、编辑配置文件jupyter_notebook_config.py&…

共享IP和独享IP如何选择,两者有何区别?

有跨境用户在选择共享IP和独享IP时会有疑问&#xff0c;不知道该如何进行选择&#xff0c;共享IP和独享IP各有其特点和应用场景&#xff0c;选择哪种方式主要取决于具体需求和预算。以下是对两者的详细比较&#xff1a; 首先两者的主要区别在于使用方式和安全性&#xff1a;共…

蓝桥杯2023年第十四届省赛真题-冶炼金属

题目描述 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V&#xff0c;V 是一个正整数&#xff0c;这意味着消耗 V 个普通金 属 O 恰好可以冶炼出一个特殊金属 X&#xff0c;当普通金属 O 的数目不足 V 时&#xff0c;无法继…

【C语言】C语言题库【附源码+持续更新】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 目录 1、练习2-1 Programming in C is fun! 2、练习2-3 输出倒三角图案 3、练习2-4 温度转换 4、练习2-6 计算物体自由下落的距离 5、练习2-8 计算摄氏温度 6、练习2-9 整数四则运算 7、练习2-10 计算分段函数[1…