贪心算法 greedy

ops/2024/12/23 2:20:36/

文章目录

  • 参考
  • 贪心算法
  • [Leetcode455 分发饼干](https://leetcode.cn/problems/assign-cookies/description/)
    • 分析
    • 题解
  • [Leetcode135 分发糖果](https://leetcode.cn/problems/assign-cookies/description/)
    • 分析
    • 题解
  • leetcode435无重叠区间
    • 分析
    • 题解

参考

https://github.com/changgyhub/leetcode_101

贪心算法

每次操作都是局部最优的,从而整体操作是最优的。

Leetcode455 分发饼干

分析

为了更多孩子能拿到饼干,对每个孩子的要求是“尽量给没拿到饼干的孩子留更多饼干”,换句话说就是“自己尽量拿更小的饼干”。因此可以对饼干排序,方便孩子挑选最小的。
不对孩子排序也可以实现分配。但是对孩子排序可以使用双指针提升计算效率。

题解

class Solution {public int findContentChildren(int[] g, int[] s) {// 将饼干大小和孩子胃口从小到大排序Arrays.sort(g);Arrays.sort(s);int count = 0; // count表示拿到饼干的孩子数量for (int i = 0, j = 0; i < g.length && j < s.length; i++, j++) {while (j < s.length && g[i] > s[j]) { // 当前饼干不满足孩子胃口,则选择下一个更大的饼干j++;}if (j < s.length) {count++;}}return count;}
}

Leetcode135 分发糖果

分析

题目要求:每个孩子至少分配到 1 个糖果。为了更少分配糖果,设置每个孩子的初始糖果数为1.
题目要求:相邻两个孩子评分更高的孩子会获得更多的糖果。为了更少分配糖果,如果孩子评分更高,只比相邻1个糖果。
这里的相邻包括左邻和右邻。先从左到右遍历孩子,如果当前孩子比左边孩子评分更高,则糖果数=左孩糖果数加1.完成遍历后,满足左邻条件。再从右往左遍历孩子,如果当前孩子比右边孩子评分更高,则糖果数=右孩糖果数加1。为了同时满足两个相邻条件,糖果数取两次遍历的最大值。

题解

class Solution {public static int candy(int[] ratings) {int[] candies = new int[ratings.length];Arrays.fill(candies, 1); // 每个孩子初始糖果数为1for (int i = 1; i < ratings.length; i++) { // 从左到右遍历if (ratings[i] > ratings[i - 1]) {candies[i] = candies[i - 1] + 1;}}for (int i = ratings.length- 2; i >= 0; i--) { // 从右往左遍历if (ratings[i] > ratings[i + 1]) {candies[i] = Math.max(candies[i + 1] + 1, candies[i]); // 取最大值}}int res = 0;for (int candy : candies) {res += candy;}return res;}
}

leetcode435无重叠区间

分析

为了不重叠且留下更多区间,每次被留下的区间的要求是“给后来者留更多空间”,即空间结束得更早。
因此按照区间的结束序号从小到大排序,每次都留下结束时间最早的,然后往后遍历,删去重叠的。

题解

class Solution {public int eraseOverlapIntervals(int[][] intervals) {if (intervals.length == 0) {return 0;}Arrays.sort(intervals, new Comparator<int[]>() {public int compare(int[] o1, int[] o2) {return o1[1] - o2[1];}}); // 对结束序号排序int count = 0;int rightIndex = intervals[0][1]; // 留下的区间的结束序号for (int i = 1; i < intervals.length; i++) {if (intervals[i][0] < rightIndex) { // 被删除区间count++;} else {rightIndex = intervals[i][1]; // 留下的区间的结束序号}}return count;}
}

http://www.ppmy.cn/ops/144198.html

相关文章

QT打包【非单个exe】

项目运行点击release 找到生成的.exe文件 复制.exe文件到一个新文件夹下 找到QT cmd文件打开 到文件所在盘 命令&#xff1a;F&#xff1a; 到.exe的文件夹路径下 cd F:\...\demo 【你的exe文件所在文件夹】 输入 windeployqt name.exe&#xff0c;name是可执行文件的名称 等…

利用Python爬虫快速获取商品历史价格信息

在电商时代&#xff0c;商品价格波动频繁&#xff0c;对于消费者和市场分析师来说&#xff0c;掌握商品的历史价格信息至关重要。这不仅能够帮助消费者做出更明智的购买决策&#xff0c;还能为市场趋势分析提供数据支持。本文将介绍如何使用Python爬虫技术快速获取商品的历史价…

GitHub 与 GitLab:差异、应用场景与核心价值

GitHub 与 GitLab&#xff1a;差异、应用场景与核心价值 一、引言 在当今的软件开发与版本控制领域&#xff0c;GitHub 和 GitLab 无疑是两款极具影响力的平台。它们都基于 Git 构建&#xff0c;为开发者提供了强大的代码托管、协作与项目管理功能。然而&#xff0c;二者在诸…

golang断言

在Go语言中&#xff0c;类型断言&#xff08;Type Assertion&#xff09;是一种用于检测接口值&#xff08;interface value&#xff09;中存储的具体类型&#xff08;concrete type&#xff09;的方法。当你有一个接口类型的变量&#xff0c;但你不确定或者需要确认它实际指向…

芯片级IO (Pad) Ring IP Checklist

SoC top顶层数字后端实现都会涉及到IO Ring &#xff08;PAD Ring&#xff09;的设计。这里面包括VDD IO,VDDIO IO, Signal IO, Corner IO&#xff0c;Filler IO&#xff0c;IO power cut cell等等。 数字后端零基础入门系列 | Innovus零基础LAB学习Day2 数字IC后端实现TOP F…

相机标定中的相机模型

一、相机标定基本原理 在图像测量过程以及机器视觉应用中&#xff0c;为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系&#xff0c;必须建立摄像机成像的几何模型,这些几何模型参数就是摄像机参数。在大多数条件下这些参数必须通过实验与计算才能得到&…

本地maven项目打包部署到maven远程私库

目的&#xff1a;在自己的maven项目中&#xff0c;要把当前maven项目部署到maven私库&#xff0c;供其他人引入依赖使用。 首先要确保你当前能访问到你的私库&#xff0c;能拉私库的maven依赖即可。 maven部署命令&#xff1a; mvn deploy:deploy-file -Dmaven.test.skiptrue -…

STM外设介绍2(Timer)

1. 定时器概述 在 STM32 系列微控制器中&#xff0c;定时器&#xff08;Timer&#xff09;是一个非常重要的外设&#xff0c;它能够提供精确的时间延时、定时控制、PWM 输出、事件计数、脉冲宽度调制&#xff08;PWM&#xff09;等多种功能。定时器通常用于定时中断、时间计数…