4.17--4.19刷题记录(贪心)

第一部分:准备工作

代码随想录中解释为:贪心的本质是选择每一阶段的局部最优,从而达到全局最优

而我的理解为:贪心实质上是具有最优子结构的一种算法。所有的解都能由当前最优的解组成。

第二部分:开始刷题

(1)455. 分发饼干 - 力扣(LeetCode)

代码思路:首先对g和s进行排序,用count记录胃口值,从前往后遍历饼干大小,如果饼干能够满足胃口,则胃口++;这时候需要注意访问超出的问题,故要加一个break判断。

class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(),g.end());sort(s.begin(),s.end());int count=0;for(int i=0;i<s.size();i++){//遍历每一个饼干,如果正好大于胃口,则直接赋值if(count==g.size()){break;}if(s[i]>=g[count]){count++;}}return count;}
};

(2)376. 摆动序列 - 力扣(LeetCode)

此题目有以下几个难点:

  1. 首先要记录差值,那么最初始化的时候ans=1
  2. 差值如何比较第一个和最后一个,这时候使用的是初始值0,和0进行比较
  3. if逻辑:如果有平数据的话怎么处理:if判断条件中一边=0,另一边不等于0
  4. 更新pre和cur,每一次进行翻转的时候才进行保存
class Solution {
public:int wiggleMaxLength(vector<int>& nums) {//首先计算两个的差值,并且与前一个比较int pre=0,cur=0;int ans=1;for(int i=1;i<nums.size();i++){cur=nums[i]-nums[i-1];if(pre>=0&&cur<0||pre<=0&&cur>0){ans++;pre=cur;}}return ans;}
};

(3)53. 最大子数组和 - 力扣(LeetCode)

贪心思路:

  1. 如果count累加器比当前ans大,那么就更新。
  2. 如果为正数,那么就累加(因为后面进行累加的话可以理解为在0的基础上进行累加,正数肯定比0大)
  3. 如果为负数,那么转换为0,后面在0的基础上加。
class Solution {
public:int maxSubArray(vector<int>& nums) {int count=0,ans=nums[0];for(int i=0;i<nums.size();i++){count+=nums[i];if(count>ans){ans=count;}if(count<0){count=0;}}return ans;}
};

(4)122. 买卖股票的最佳时机 II - 力扣(LeetCode)

贪心思路:

  1. 注意题目为可以同一天进行操作,也就是说可以同一天买卖
  2. 如果后一天比前一天利润大,那么卖掉。因为如果后面有更大的,呢么可以买当前的后一个到时候再卖掉。其原理等于买现在卖后面更大的。
class Solution {
public:int maxProfit(vector<int>& prices) {int profit=0;for(int i=0;i<prices.size()-1;i++){int sub=prices[i+1]-prices[i];if(sub>0){profit+=sub;}}return profit;}
};

(5)55. 跳跃游戏 - 力扣(LeetCode)

贪心思路:

  1. 不断更新自己能去的最大值,如果能够到达队尾,那么就返回true
  2. 初始值的设定,far一开始为0,表示自己的第一步
  3. far>=n-1,表示到达末尾元素
class Solution {
public:bool canJump(vector<int>& nums) {int far=0;int n=nums.size();for(int i=0;i<=far;i++){far=max(far,nums[i]+i);if(far>=n-1)return true;}return false;}
};

(6)45. 跳跃游戏 II - 力扣(LeetCode)

贪心思路:

  1. 确定一个区间和一个值,区间表示这个范围内可以到达的地方,值表示这个范围内的下一步能够到达的地方。
class Solution {
public:int jump(vector<int>& nums) {if(nums.size()==1)return 0;int count=0;int n=nums.size();int nextfar=0,curfar=0;for(int i=0;i<=curfar;i++){nextfar=max(nextfar,nums[i]+i);if(i==curfar){count++;curfar=nextfar;}if(curfar>=n-1)return count;}return 1;}
};

(7)1005. K 次取反后最大化的数组和 - 力扣(LeetCode)

贪心:将绝对值最大的进行翻转。

方法一:一次排序

class Solution {
static bool cmp(int a,int b){return abs(a)>abs(b);
}
public:int largestSumAfterKNegations(vector<int>& A, int K) {sort(A.begin(), A.end(), cmp);       // 第一步for (int i = 0; i < A.size(); i++) { // 第二步if (A[i] < 0 && K > 0) {A[i] *= -1;K--;}}if (K % 2 == 1) A[A.size() - 1] *= -1; // 第三步int result = 0;for (int a : A) result += a;        // 第四步return result;}
};

方法二:两次排序

class Solution {
public:int largestSumAfterKNegations(vector<int>& nums, int k) {sort(nums.begin(),nums.end());int i;int result=0;for(i=0;i<nums.size()&&k>0;i++){if(nums[i]<0){nums[i]=-nums[i];k--;}}sort(nums.begin(),nums.end());if(k%2==1){nums[0]=0-nums[0];}for(int i:nums){result+=i;}return result;}
};

(8)134. 加油站 - 力扣(LeetCode)

贪心思路:

  1. cur_rest表示当前的剩余量,如果累加和小于零就说明从旧的start无法到达当前的i。那么新的start就要从i+1开始
  2. total_rest表示总和,如果他小于零则表示不管从哪儿开始都无法到达终点。
  3. 所以本题用贪心的思路就是选择能够满足当前cur_rest的start,如果最后total大于等于零,那么就表示可达。(我的理解就是假如最后total=0,那么一定有一个分界点,使得后半部分的和能够填满前半部分的负数。那么就是这个start。如果总和为正数,那么就更好了。
class Solution {
public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int start=0;int cur_rest=0,total_rest=0;for(int i=0;i<cost.size();i++){cur_rest+=gas[i]-cost[i];total_rest+=gas[i]-cost[i];if(cur_rest<0){cur_rest=0;start=i+1;}}if(total_rest<0)return -1;return start;}
};

(9)135. 分发糖果 - 力扣(LeetCode)

贪心策略:

  1. 一次是从左到右遍历,只比较右边孩子评分比左边大的情况。
  2. 一次是从右到左遍历,只比较左边孩子评分比右边大的情况。
class Solution {
public:int candy(vector<int>& ratings) {int n=ratings.size();vector<int>candies(n,1);int count=0;for(int i=0;i<n-1;i++){if(ratings[i]<ratings[i+1]){candies[i+1]=candies[i]+1;}}for(int i=n-1;i>0;i--){if(ratings[i]<ratings[i-1]){candies[i-1]=max(candies[i]+1,candies[i-1]);}}for(int i=0;i<n;i++){count+=candies[i];}return count;}
};

(10)860. 柠檬水找零 - 力扣(LeetCode)

贪心思路:此题比较简单,要分三种情况进行讨论

  1. 五块的:直接++
  2. 十块的:十块++,五块--
  3. 二十块的:优先十块--+五块--或者五块直接减三
class Solution {
public:bool lemonadeChange(vector<int>& bills) {int five=0,ten=0,ershi=0;for(int i=0;i<bills.size();i++){//5if(bills[i]==5){five++;}//10else if(bills[i]==10){if(five==0)return false;ten++;five--;}//20else if(bills[i]==20){//if(ten>0&&five>0){ten--;five--;ershi++;}else if(five>=3){five=five-3;ershi++;}else return false;}}return true;}
};

(11)406. 根据身高重建队列 - 力扣(LeetCode)

贪心思路:

  1. 首先明确有两个维度,分别是身高以及位置。如果保证位置有序的话,没有办法同时保证身高的有序性。那么就只能确定身高这一个维度,从而进一步确定位置
  2. 贪心的思路就是保证当前序列的有序性,那么如何保证呢?就不断取当前元素进行插入。
class Solution {
public:static bool cmp(const vector<int>&a,const vector<int>&b){if(a[0]==b[0])return a[1]<b[1];return a[0]>b[0];}vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort(people.begin(),people.end(),cmp);vector<vector<int>>queue;for(int i=0;i<people.size();i++){int position=people[i][1];queue.insert(queue.begin()+position,people[i]);}return queue;}
};

(12)452. 用最少数量的箭引爆气球 - 力扣(LeetCode)

贪心思路:

  1. 首先进行排序,按照每一个气球的直径的最远距离进行从小到大的排序。
  2. 贪心策略为:使用最少的针扎掉尽可能多的气球
class Solution {
public:static bool cmp(vector<int>&a,vector<int>&b){return a[1]<b[1];}int findMinArrowShots(vector<vector<int>>& points) {sort(points.begin(),points.end(),cmp);int arrow=1;int end=points[0][1];for(int i=1;i<points.size();i++){if(points[i][0]<=end){continue;}else{arrow+=1;end=points[i][1];}}return arrow;}
};

(13)435. 无重叠区间 - 力扣(LeetCode)

贪心思路:和上题思路一样,秒掉

class Solution {
public:static bool cmp(vector<int>&a,vector<int>&b){return a[1]<b[1];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {sort(intervals.begin(),intervals.end(),cmp);int ans=1;int end=intervals[0][1];for(int i=1;i<intervals.size();i++){if(intervals[i][0]<end){continue;}else{ans+=1;end=intervals[i][1];}}return intervals.size()-ans;}
};

(14)763. 划分字母区间 - 力扣(LeetCode)

贪心思路:给不同的字符设置最晚出现位置,在这个区间内不不断进行扩展,如果i到达了最远位置并没有继续向前扩展,则说明这是一个区间间隔。

class Solution {
public:vector<int> partitionLabels(string s) {vector<int>ans;unordered_map<char,int>cnt;for(int i=0;i<s.size();i++){cnt[s[i]]=i;}int left=0,right=0;for(int i=0;i<s.size();i++){right=max(right,cnt[s[i]]);if(i==right){ans.push_back(right-left+1);left=right+1;}}return ans;}
};

(15)56. 合并区间 - 力扣(LeetCode)

贪心思路:整体来讲思路没有问题,只是处理最后一个vector的时候存在一些问题。以及最后ans.push_back({start,end});使用的是方括号,因为这是数组初始化的一个方式。

class Solution {
public:static bool cmp(vector<int>&a,vector<int>&b){return a[0]<b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int>>ans;sort(intervals.begin(),intervals.end(),cmp);int start=intervals[0][0],end=intervals[0][1];for(int i=1;i<intervals.size();i++){if(intervals[i][0]<=end){end=max(end,intervals[i][1]);}else{ans.push_back({start,end});start=intervals[i][0];end=intervals[i][1];}}ans.push_back({start,end});return ans;}
};

(16)738. 单调递增的数字 - 力扣(LeetCode)

贪心思路:从后往前遍历,flag记录从当前位置开始到结尾一直为0的数字

class Solution {
public:int monotoneIncreasingDigits(int n) {string num=to_string(n);int flag=num.size();for(int i=num.size()-1;i>0;i--){if(num[i]<num[i-1]){flag=i;//不是flag--num[i-1]--;}}for (int i = flag; i < num.size(); i++) {num[i] = '9';}return stoi(num);}
};

(17)968. 监控二叉树 - 力扣(LeetCode)

贪心思路:

  1. 节点一共有三种性质:第一种性质:未覆盖0;第二种性质:已覆盖2;第三种性质:装摄像头1
  2. 情况一共分为九种,00->1,01->1,02->1,10->1,11->2,12->2,20->1,21->2,22->0
  3. 进行分类可得:
  4. 第一类(根节点返回0):22->0,只有一种情况,当左右两个节点都已经被当前节点的下层所监控到,根节点表示未被监控到
  5. 第二类(根节点装摄像头,返回1):00->1,01->1,02->1,10->1,20->1,有五种情况,只要左子树或右子树里面有一个0,未被覆盖到就可以
  6. 第三类(根节点被监控到,返回2):11->2,12->2,21->2,有三种情况,只要左子树或者右子树有一个1,并且都没有零即可
class Solution {
public:int ans=0;int dfs(TreeNode *root){if(root==nullptr)return 2;int left=dfs(root->left);int right=dfs(root->right);if(left==0||right==0){ans++;return 1;}else if(left==1||right==1){return 2;}else if(left==2&&right==2){return 0;}//其实根本不会遍历到以下这个东西,所有情况都已经被包含在if中return 2;}int minCameraCover(TreeNode* root) {if(dfs(root)==0)ans++;return ans;}
};

第三部分:总结(贪心专题已经全部完结)

  1. 贪心法首先要确定思路,如何实现局部最优解,从而一步一步得到全局最优解。如果必要的时候可以用到排序,排序的话要注意函数static以及&的使用。
  2. 在代码随想录中主要有几个问题,以下几条具体展开:首先就是多个维度,这种题一般就是先确定一个可以确定的维度,进而扩充另一个维度。(比如说9,11)
  3. 区间类的问题:比如说会议安排问题,扎气球问题,这个就需要考虑左排序还是右排序。(比如说13,14,15)
  4. 判断子序列的问题:这个过程中需要时刻注意一段和的正负性,如果是负数的话应该怎么办(比如说2,3,4)
  5. 贪心中的滑动窗口问题:需要设置两个相同类型的量,在求第一个量的时候探索第二个量的范围,然后交换,直到求到最后一个解。(比如说5,6)

夹带一点私活鼓励一下自己:这是樊振东在2024巴黎奥运会上战胜张本智和时候的一张照片。不到最后一刻,永远都会有翻盘的机会。及时面对再大的困难,在场上还是要有一颗坚定的心。

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

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

相关文章

学习笔记十七——Rust 支持面向对象编程吗?

&#x1f9e0; Rust 支持面向对象编程吗&#xff1f; Rust 是一门多范式语言&#xff0c;主要以 安全、并发、函数式、系统级编程为核心目标&#xff0c;但它同时也支持面向对象的一些关键特性&#xff0c;比如&#xff1a; 特性传统 OOP&#xff08;如 Java/C&#xff09;Ru…

【Linux】43.网络基础(2.5)

文章目录 2.4 TCP/UDP对比2.4.1 用UDP实现可靠传输(经典面试题) 2.5 TCP 相关实验2.5.1 理解 listen 的第二个参数 2.4 TCP/UDP对比 我们说了TCP是可靠连接, 那么是不是TCP一定就优于UDP呢? TCP和UDP之间的优点和缺点, 不能简单, 绝对的进行比较TCP用于可靠传输的情况, 应用于…

three.js与webgl在buffer上的对应关系

一、three.js的类名 最近开始接触three.js 看到three.js中的一些类名和webgl的很相似 不自觉的就想对比一下 二、three.js中绘制4个点 // 创建点的几何体 const vertices new Float32Array([0.0, 0.0, 0.0, // 点11.0, 0.0, 0.0, // 点20.0, 1.0, 0.0, // 点30.…

DataWhale AI春训营 问题汇总

1.没用下载训练集导致出错&#xff0c;爆错如下。 这个时候需要去比赛官网下载对应的初赛训练集 unzip -d /mnt/workspace/sais_third_new_energy_baseline/data /mnt/workspace/sais_third_new_energy_baseline/初赛训练集.zip 在命令行执行这个命令解压 2.没定义测试集 te…

CANFD技术在新能源汽车通信网络中的应用与可靠性分析

一、引言 新能源汽车产业正处于快速发展阶段&#xff0c;其电子系统复杂度不断攀升&#xff0c;涵盖众多传感器、控制器与执行器。高效通信网络成为确保新能源汽车安全运行与智能功能实现的核心要素。传统CAN总线因带宽限制&#xff0c;难以满足高级驾驶辅助系统&#xff08;A…

Python字典深度解析:高效键值对数据管理指南

一、字典核心概念解析 1. 字典定义与特征 字典&#xff08;Dictionary&#xff09;是Python中​​基于哈希表实现​​的无序可变容器&#xff0c;通过键值对存储数据&#xff0c;具有以下核心特性&#xff1a; ​​键值对结构​​&#xff1a;{key: value}形式存储数据​​快…

C++中unique_lock和lock_guard区别

目录 1.自动锁定与解锁机制 2.灵活性 3.所有权转移 4.可与条件变量配合使用 5.性能开销 在 C 中&#xff0c;std::unique_lock 和 std::lock_guard 都属于标准库 <mutex> 中的互斥锁管理工具&#xff0c;用于简化互斥锁的使用并确保线程安全。但它们存在一些显著区别…

Nvidia显卡架构演进

1 简介 显示卡&#xff08;英语&#xff1a;Display Card&#xff09;简称显卡&#xff0c;也称图形卡&#xff08;Graphics Card&#xff09;&#xff0c;是个人电脑上以图形处理器&#xff08;GPU&#xff09;为核心的扩展卡&#xff0c;用途是提供中央处理器以外的微处理器帮…

下载electron 22.3.27 源码错误集锦

下载步骤同 electron源码下载及编译_electron源码编译-CSDN博客 问题1 从github 下载 dugite超时&#xff0c;原因没有找到 Validation failed. Expected 8ea2d0d3c9d9e4615069913207371ffe892dc10fb93975972f2f6e668f2e3b3a but got e3b0c44298fc1c149afbf4c8996fb92427ae41e…

洛谷P1120 小木棍

#算法/进阶搜索 思路: 首先,最初始想法,将我们需要枚举的长木棍个数计算出来,在dfs中,我们先判断,此时枚举这根长木棍需要的长度是否为0,如果为0,我们就枚举下一个根木棍,接着再判断,此时仍需要枚举的木棍个数是否为0,如果为0,代表我们这种方案可行,直接打印长木棍长度,接着我们…

Linux教程-常用命令系列二

文章目录 1. 系统管理常用命令1. useradd - 创建用户账户功能基本用法常用选项示例 2. passwd - 管理用户密码功能基本用法常用选项示例 3. kill - 终止进程功能基本用法常用信号示例 4. date - 显示和设置系统时间功能基本用法常用选项时间格式示例 5. bc - 高精度计算器功能基…

18、TimeDiff论文笔记

TimeDiff **1. 背景与动机****2. 扩散模型基础****3. TimeDiff 模型****3.1 前向扩散过程****3.2 后向去噪过程** 4、TimeDiff&#xff08;架构&#xff09;原理训练推理其他关键点解释 DDPM&#xff08;相关数学&#xff09;1、正态分布2、条件概率1. **与多个条件相关**&…

整合SSM——(SpringMVC+Spring+Mybatis)

目录 SSM整合 创建项目 导入依赖 配置文件 SpringConfig MyBatisConfig JdbcConfig ServletConfig SpringMvcConfig 功能模块 测试 业务层接口测试 控制层测试 SSM是Java Web开发中常用的三个主流框架组合的缩写&#xff0c;分别对应Spring、Spring MVC、MyBatis…

P1042【深基8,例1】乒乓球

【题目背景】国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革&#xff0c;以推动乒乓球运动在全球的普及。其中 11 分制改革引起了很大的争议&#xff0c;有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位&#xff0c;他退役之后走上了乒乓球研究工作…

ubuntu24.04上使用qemu和buildroot模拟vexpress-ca9开发板构建嵌入式arm linux环境

1 准备工作 1.1 安装qemu 在ubuntu系统中使用以下命令安装qemu。 sudo apt install qemu-system-arm 安装完毕后&#xff0c;在终端输入: qemu- 后按TAB键&#xff0c;弹出下列命令证明安装成功。 1.2 安装arm交叉编译工具链 sudo apt install gcc-arm-linux-gnueabihf 安装之…

用 R 语言打造交互式叙事地图:讲述黄河源区生态变化的故事

目录 🌟 项目背景:黄河源头的生态变迁 🧰 技术栈介绍 🗺️ 最终效果预览 💻 项目构建步骤 1️⃣ 数据准备 2️⃣ 构建 Leaflet 地图 3️⃣ 使用 scrollama 实现滚动触发事件 4️⃣ 使用 R Markdown / Quarto 打包发布 🎬 效果展示截图 📦 完整代码仓库 …

CTF--秋名山车神

一、原网页&#xff1a; 二、步骤&#xff1a; 1.尝试用计算器计算&#xff1a; 计算器溢出&#xff0c;无法正常计算 2.使用python计算&#xff1a; 得出计算结果为&#xff1a;1864710043732437134701060769 3.多次刷新页面&#xff1a; 发现变量为value&#xff0c;要用pos…

CRC实战宝典:从原理到代码,全面攻克循环冗余校验

CRC实战宝典&#xff1a;从原理到代码&#xff0c;全面攻克循环冗余校验 github开源&#xff1a;CRC软硬件协同测试项目 CRC 简介 CRC&#xff08;循环冗余校验&#xff09;是一种强大的错误检测技术&#xff0c;广泛应用于数字网络和存储系统。它是确保数据完整性的重要方法…

【大模型】DeepSeek + Coze 打造个人专属AI智能体使用详解

目录 一、前言 二、AI智能体介绍 2.1 什么是AI智能体 2.2 AI智能体核心能力 2.3 AI智能应用场景 三、coze 介绍 3.1 coze是什么 3.1.1 平台概述 3.1.2 平台适用人群 3.2 平台核心功能 3.3 coze可以做什么 3.4 为什么选择coze 四、coze 搭建AI智能体操作实践 4.1 搭…

MySQL入门:数据表的创建

​今天我们来介绍一下除HTML外的另一种语言&#xff1a;MySQL语言&#xff1b; MySQL&#xff1a;即一种用于管理和处理关系数据库的标准语言。要用于执行查询、更新、管理数据库中的数据以及定义和操作数据库结构。 接下来我会逐一介绍它的作用以及其中数据表&#xff0c;数据…