春招Leetcode刷题日记-D2-贪心算法-训练专题

news2024/11/28 8:50:28

D2-贪心算法-训练专题

  • 贪心算法使用总结
  • 力扣605. 种花问题
    • 思路
    • 代码
  • 力扣763. 划分字母区间
    • 思路
    • 代码
    • 另一种思路


贪心算法使用总结

当我们意识到,满足贪心算法三要素时候,解决贪心算法问题的时候,一定要遵循的步骤:

1、读懂题目限制条件
2、明确贪心算法使用的三大原则
3、切记,对原始数组中的数据,可以先进行预处理(统计一遍信息-如频率、个数、第一次出现位置、最后一次出现位置等,或者进行相关运算-如计算前缀和等)之后,再进行操作
4、制定贪心策略

力扣605. 种花问题

题目链接:605. 种花问题
在这里插入图片描述

思路

题目要求我们,在不打破规则的前提下,看能否种下n个东西:所以我们只需要看这个地方,最多能种多少即可,明显贪心思想。
1、一定要搞明白规则!想种东西,位置i必须满足:

1、必须是’0’
2、前后必须都得是’0’(边界也可以)

2、所以在这个规则之下,遍历一遍数组即可,发现可以种下,就把数组第i处改为1即可,统计最多可以种多少。

代码

class Solution {
public:
	bool canPlaceFlowers(vector<int>& flowerbed, int n) {
		int size = flowerbed.size();
		int i = 0;
		int cnt = 0;
		while (i < size) {
			if (flowerbed[i] == 1) {
				i++;
			}
			else {
				if ((i - 1 < 0 || flowerbed[i - 1] != 1) && (i + 1 >= size || flowerbed[i + 1] != 1)) {//先考虑边界,在考虑是不是0
					cnt++;
					flowerbed[i] = 1;
					i++;
				}
				else {
					i++;
				}
			}
		}
		return cnt >= n;
	}
};

力扣763. 划分字母区间

题目链接:763. 划分字母区间
在这里插入图片描述
在这里插入图片描述

思路

根据题意,我们需要按照一定的规则进行分划数组
1、但是,我们什么额外的信息都没有,不方便操作,所以,一定要记住!!!!!!对于给出的一大串数据无头绪,先进行"预处理"工作,预处理方向有限,可以帮助我们找到数据规律,确定解题方案。

1、统计形式的预处理,包括:频率、个数、第一次出现位置、最后一次出现位置等
2、运算形式的预处理,包括:前缀和等

2、根据规则,划分好的一个片段中出现的字母,不能在其他片段中出现,所以对于任何一个字母而言,他最后一次出现的地方才可能是作为划分终点的,要不就一定违背了规则。
3、所以,预处理时候,我们存一下所有字母最后出现位置。
4、初始化划分起点终点,初始都为0。
5、用指针i遍历s,每走到一个地方,那个字母一定包括在这个片段之中,那么最终分划的位置和这个字母最后出现的位置二者取最大的,保证这个字母能完全出现在这个片段之中,当足迹i==分划终点,则这个片段分完了,这就是贪心策略

代码

class Solution {
public:
	vector<int> partitionLabels(string s) {//另一种贪心思想,效率更优秀
		int ends[30];
		int n = s.size();
		vector<int> ans;
		for (int i = 0; i < n; i++) {//记录每个字母最后出现位置
			ends[s[i] - 'a'] = i;
		}
		int b = 0, e = 0;
		for (int i = 0; i < n; i++) {
			e = max(e, ends[s[i] - 'a']);
			if (i == e) {
				ans.push_back(e - b + 1);
				b = e + 1;//重新初始化下一个片段起点
			}
		}
		return ans;
	}
};

另一种思路

1、预处理中,我们可以同时收集,“刚出现位置"和"最后出现位置”,这样,任意一个字母,就都可以看成出现在一个区间上,统计出所有这些区间。
2、比如说,题目中,第一个样例,前九个元素,分成第一个片段,a出现在[0,8],b出现在[1,5],c出现在[4,7],同理再找到第二个片段中,字母出现的区间
3、不难发现:
<1>当我们列出所有的出现了的字母的区间之后,每一个片段里的字母对应的区间都是可以合并的,a、b、c有交集,可以合并成一个大的区间,恰好是[0,8]长度为9
<2>不同片段对应的字母区间,无交集,不能合并重叠区间
4、综上,这道题统计完字母出现区间之后,就转化成了合并重叠区间问题,这个详见D2-贪心算法-区间问题中的第三题

class Solution {
public:
	vector<int> partitionLabels(string s) {
		vector<vector<int>> section;//统计出现的字母的起始位置和终止位置
		int start[30] = {};
		int ends[30] = {};
		vector<int> ans;
		vector<bool> v(30, false);

		int n = s.size();
		for (int i = 0; i < n; i++) {
			if (!v[s[i] - 'a']) {
				start[s[i] - 'a'] = i;
				v[s[i] - 'a'] = true;
			}
		}
		for (int i = 0; i < n; i++) {
			ends[s[i] - 'a'] = i;
		}

		for (int i = 0; i < 30; i++) {
			if (v[i]) {
				section.push_back({ start[i],ends[i] });
			}
		}
		int size = section.size();

		sort(section.begin(), section.end(), [](const auto& a, const auto& b) {//合并重叠区间
			return a[0] < b[0];
		});
		int b = section[0][0], e = section[0][1];
		for (int i = 1; i < size; i++) {
			if (section[i][0] > e) {//不可以合并
				ans.push_back(e - b + 1);//写入答案
				b = section[i][0];//初始化端点位置
				e = section[i][1];
			}
			else {//可以合并,更新端点位置
				b = min(b, section[i][0]);
				e = max(e, section[i][1]);
			}
		}
		ans.push_back(e - b + 1);
		return ans;
	}
};


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

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

相关文章

数据结构与算法:7种必须会的排序以及3种非基于比较排序

1.什么是排序 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序…

大数据专业职业前景如何

大数据专业毕业生未来的岗位选择空间比较大&#xff0c;有三大类岗位可选择分别是大数据开发岗位、大数据分析岗位和大数据运维岗位&#xff0c;在不同的行业和技术体系结构下这些岗位也包含很多细分的岗位。 大数据开发岗位分为平台研发岗位和行业场景开发岗位两大类&#xf…

usbmon---Linux下USB数据传输监控

文章目录Usb包的总类&#xff08;1&#xff09;令牌包&#xff08;2&#xff09;数据包&#xff08;3&#xff09;握手包&#xff08;4&#xff09;特殊包Usb包的事务usb四种传输类型批量传输等时传输中断传输控制传输usbmon的使用&#xff08;1&#xff09;首先检测内核是否支…

算法刷题打卡第90天:表现良好的最长时间段

表现良好的最长时间段 难度&#xff1a;中等 给你一份工作时间表 hours&#xff0c;上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候&#xff0c;那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」&#xff0c;意味在这…

常量const、引用、指针的大杂烩

文章目录1 普通引用1.1 对普通值的普通引用1.2 对常量值的普通引用1.3 对普通指针的普通引用1.4 对常量指针的普通引用1.5 对指针常量的普通引用1.6 对指向常量的指针常量的普通引用2 常量引用2.1 对普通值的常量引用2.2 对常量值的常量引用2.3 对普通指针的常量引用2.4 对常量…

2023年留学基金委(CSC)西部/地方合作项目选派办法及解读

2023年2月13日国家留学基金委&#xff08;CSC&#xff09;官方网站发布了2023年西部地区人才培养特别项目、地方合作项目通知。知识人网小编现将其选派工作流程及选派办法原文转载并加以解读、提出建议。知识人网建议1. 邀请函是公派申请的必备条件。对于外语语言证明未达标者&…

React学习笔记(番外二)——列表多选批量处理复合组件

React学习笔记&#xff08;番外二&#xff09;——列表多选批量操作复合组件前言〇、Show you the code一、 任务分析及拆解表头行的Checkbox——总开关记录行的Checkbox——行级开关二、 基础实现表头行的文件——header-row.js记录行的文件——record-row.js页面的文件App.js…

Linux操作系统学习(进程退出)

文章目录进程终止退出码进程退出场景进程退出的方式进程终止 退出码 ​ 我们知道每个main函数结尾都有return&#xff0c;一般都是return 0&#xff0c;用echo $&#xff1f;就可以查看它的退出码&#xff0c;0就是他的退出码&#xff0c;也可以写一些别的数值&#xff0c;比…

微服务项目【网关服务限流熔断降级分布式事务】

网关服务限流熔断降级 第1步&#xff1a;启动sentinel-dashboard控制台和Nacos注册中心服务 第2步&#xff1a;在网关服务中引入sentinel依赖 <!-- sentinel --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-…

好好学react源码然后惊艳所有人

hello&#xff0c;这里是潇晨&#xff0c;今天我们来聊聊react源码&#xff0c;作为使用react多年的前端工程师&#xff0c;我们是否还在使用着各种应用层面的库、框架呢&#xff0c;是否在面试过程中遇到一些关于react源码方面的问题呢&#xff0c;如果是&#xff0c;那么是否…

数据结构与算法:java对象的比较

1.基本类型的比较 在Java中&#xff0c;基本类型的对象可以直接比较大小。 public class TestCompare {public static void main(String[] args) {int a 10;int b 20;System.out.println(a > b);System.out.println(a < b);System.out.println(a b);char c1 A;char…

互联网舆情监测公司监测哪些内容,TOOM北京舆情监测公司

互联网舆情监测公司是一种提供舆情监测、分析和管理服务的公司&#xff0c;其业务主要涉及互联网舆情监测、数据分析、报告撰写、危机处理等方面。这些公司通过使用各种技术和工具&#xff0c;帮助客户监测他们在互联网上的声誉和品牌形象&#xff0c;并提供相应的建议和解决方…

前端基于 Docker 的 SSR 持续开发集成环境实践

项目收益 整体开发效率提升20%。加快首屏渲染速度&#xff0c;减少白屏时间&#xff0c;弱网环境下页面打开速度提升40%。 权衡 在选择使用SSR之前&#xff0c;需要考虑以下事项&#xff01; SSR需要可以运行Node.js的服务器&#xff0c;学习成本相对较高。对于服务器而言&a…

“就业”or“创业”,大学生毕业如何选择,校园市场是新出路?

据公开数据显示&#xff0c;2023届全国高校毕业生预计达到1158万人&#xff0c;同比增加82万人。规模和增量创历史新高。今年就业形势再次复杂严峻起来。 “就业难”这个词在疫情下的毕业季尤为明显。超过1000万人同时加入了争夺就业机会的行列&#xff0c;形成了庞大的求职阵容…

网络安全-靶场搭建

网络安全-靶场搭建 靶场就是给你练习用的&#xff0c;因为如果你直接用其他网站搞会把他搞炸的&#xff08;犯法的&#xff09; 简单概括&#xff1a;把靶场文件放到Phpstudy的网站&#xff0c;放到根目录里面 要用到之前下载的phpstudy 然后开启mysql和apache&#xff0c;默…

【2023】Prometheus-Blackbox_exporter使用

目录1.下载及安装blackbox_exporter2.修改配置文件设置监控内容2.1.使用http方式作为探测3.与prometheus集成4.导入blackbox仪表盘进行观测1.下载及安装blackbox_exporter 下载安装包 wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.23.0/black…

企业现代化管理模式中,数据指标体系是什么

当前时代&#xff0c;数据已经成为了构建现代社会的重要元素&#xff0c;渗透到人们生活的方方面面。在商业世界中&#xff0c;数据的传播应用更是按下了加速键&#xff0c;在短时间内就让各行各业的企业开始围绕数据进行信息化、数字化转型&#xff0c;把数据当作企业重要的战…

前端原生 CSS 跑马灯效果,无限轮播(横竖版本,带渐变遮罩,简单实用)

一、横版跑马灯 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…

Redis入门到实战-数据结构 (四、原理篇)

一、动态字符串SDS 我们都知道Redis中保存的Key是字符串&#xff0c;value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串&#xff0c;因为C语言字符串存在很多问题&#xff1a; 获取字符串长度的需要通过…

计算机网络之http07 http2,http3

HTTP1.2 http1.2都做了哪些优化 (1)头部压缩 使用HPACK压缩头部 头部冗长&#xff0c;大量重复字段 &#xff08;2&#xff09;二进制帧 将报文头部和内容字符编码改为二进制格式 字符编码未压缩 &#xff08;3&#xff09;并发传输 解决h1.1 队头阻塞问题&#xff0c;多车道 …