贪心算法及相关例题

目录

什么是贪心算法?

leetcode455题.分发饼干

leetcode376题.摆动序列

leetcode55题.跳跃游戏I

leetcode45题.跳跃游戏II

leetcode621题.任务调度器

leetcode435题.无重叠空间

leetcode135题.分发糖果


什么是贪心算法?

贪心算法更多的是一种思想,没什么套路。

贪心:顾名思义,贪心就是只顾眼前的利益。只关注局部最优解,当前状态的最优解,不关注最后全局最优解。

举个正面例子:从不同面额的人民币中选十张,怎么选金额最大?贪心算法就会每次都选100元面额的人民币,选十张后得到的金额刚好也是全局最优解。

举个反面例子:有一个承重10斤的包,有五个石头,重量分别是7、4、5、4、2斤,怎样放才能让背包利用率最大?贪心算法就会每次都选最大的,先是7斤,然后再选2斤,总共利用了9斤。而全局最优的解法应该是:4 + 4 + 2 = 10斤。所以贪心算法不一定是最优解。

我们学贪心算法是希望能够通过局部最优解推算出全局最优解。我们有什么套路呢?答案是没有。对于一道题你无法用套路来推算能否用贪心算法做,我们只能靠直觉+自己多做题,通过刷题来掌握常见的贪心算法题。面试时贪心考的不多,我们重点掌握七八道核心题就可以了。

leetcode455题.分发饼干

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

思路:我们可以把小尺寸的饼干尽可能地给胃口小的孩子,或者大尺寸饼干尽量给胃口大的孩子。 

class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);//按照胃口大小给孩子们排序Arrays.sort(s);//按照饼干尺寸给饼干排序//长度int n = g.length;//孩子个数int m = s.length;//饼干个数int res = 0;//存放结果//遍历饼干,把小尺寸饼干给小胃口的孩子for(int i = 0; res < n && i < m; i++){//如果饼干尺寸大于等于孩子的胃口if(s[i] >= g[res]){res++;//那就下一个孩子}}return res;//时间复杂度:nlogn+mlogm 空间复杂度O(1)}
}

leetcode376题.摆动序列

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

class Solution {public int wiggleMaxLength(int[] nums) {if(nums.length == 1) return nums.length;int res = 1;//防止最后一个峰值丢失int pre = 0;//保存前一个峰值是正是负int cur = 0;//保存当前差值for(int i = 0; i < nums.length - 1; i++){cur = nums[i + 1] - nums[i];if(pre <= 0 && cur > 0 || pre >= 0 && cur < 0){res++;pre = cur;}}return res;}
}

leetcode55题.跳跃游戏I

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

 1)如果从当前位置可以跳到位置i,表示i之前的所有位置我们都能到达。

2)我们要尽可能地跳的远一点。

3)判断自己能否到达最后一个位置。

class Solution {public boolean canJump(int[] nums) {int max = 0;//我们能跳到的最远的位置for(int i = 0; i < nums.length; i++){if(max < i){return false;//连i这个位置都到不了}max = Math.max(max, i + nums[i]);}return true;}
}

leetcode45题.跳跃游戏II

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

class Solution {public int jump(int[] nums) {int start = 0;int end = 0;int res = 0;int max = 0;//能够跳跃的最远的位置while(end < nums.length){if(max >= nums.length - 1) return res;for(int i = start; i <= end; i++){max = Math.max(max, i + nums[i]);           }res++;start = end + 1;//表示下一次跳跃的起始位置end = max;//end是当前能跳跃的最远的位置}return res;}
}

leetcode621题.任务调度器

621. 任务调度器 - 力扣(LeetCode)

class Solution {public int leastInterval(char[] tasks, int n) {//找出出现次数最多的字母int []arr = new int[26];int k = 0;//假设出现次数最多的字母有k种for(int i = 0; i < tasks.length; i++){arr[tasks[i] - 'A']++;//第 i 个元素的 ASCII 码减去字符 'A' 的 ASCII 码,得到的结果作为索引值//计算出该字母与字母 'A' 之间的偏移量。然后,这个偏移量被用作索引值}int max = 0;for(int i = 0; i < 26; i++){max = Math.max(max, arr[i]);}for(int i = 0; i < 26; i++){if(arr[i] == max){k++;}}//间隔够插和不够插中的最大值max = Math.max(((max - 1)*(n + 1) + k), tasks.length);return max;}
}

leetcode435题.无重叠空间

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

class Solution {//转化问题-——>保存最大的区间数量使得区间不重叠//我们要留下在不重叠的情况下,右边界比较小的区间//步骤:对数组排序,以第二个元素排序//    之后遍历数组,遇到不重叠的就选择留下来public int eraseOverlapIntervals(int[][] intervals) {if(intervals.length <= 1) return 0;//Arrays.sort() 方法的第二个参数是一个比较器(Comparator)//对二维数组 intervals 按照每个子数组的第二个元素进行升序排序。/*当我们使用如 Arrays.sort() 这样的方法进行排序时,元素的实际交换操作是在单独的排序算法(如快速排序、归并排序等)中进行的,而比较器仅负责提供元素之间的相对顺序信息。这些排序算法会根据比较器的返回值来更新元素间的相对顺序,并在适当的时候实际交换元素的位置,最终得到一个有序序列。 */Arrays.sort(intervals, new Comparator<int[]>(){//重写comparepublic int compare(int[] s1, int[] s2){return s1[1] - s2[1];}});int max = 1;//表示当前已经选择的不重叠区间的数量int right = intervals[0][1];for(int i = 1; i < intervals.length; i++){if(intervals[i][0] >= right){max++;right = intervals[i][1];}}return intervals.length - max;}
}

leetcode135题.分发糖果

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

class Solution {public int candy(int[] ratings) {//孩子糖数受左右两边相邻的孩子影响/*左规则:如果只受左边孩子的影响,比左边的孩子分数高就比左边的孩子多获得一个糖果右规则:如果只受右边孩子影响,比右边孩子的分数高就多获得一个糖果整体结合左右规则来看,就在判断每个孩子的糖果数中取两个规则中的较大数       */int[] left = new int[ratings.length];int[] right = new int[ratings.length];//填充左规则left[0] = 1;for(int i = 1; i < ratings.length; i++){if(ratings[i] > ratings[i - 1]){left[i] = left[i - 1] + 1;}else{left[i] = 1;}}//填充右规则right[ratings.length - 1] = 1;for(int i = ratings.length - 2; i >= 0; i--){if(ratings[i] > ratings[i + 1]){right[i] = right[i + 1] + 1;}else{right[i] = 1;}}int res = 0;for(int i = 0; i < ratings.length; i++){int max = Math.max(left[i], right[i]);res += max;}return res;}
}

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

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

相关文章

《QT从基础到进阶·三十七》QWidget实现左侧导航栏效果

NavigationBarPlugin插件类实现了对左侧导航栏的管理&#xff0c;我们可以在导航栏插件中添加界面&#xff0c;并用鼠标点击导航栏能够切换对应的界面。 源码在文章末尾 实现效果如下&#xff1a; NavigationBarPlugin实现的接口如下&#xff1a; class NAVIGATIONBAR_EXP…

C#,数值计算——插值和外推,多项式插值与外推插值(Poly_interp)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 多项式插值与外推插值 /// Polynomial Interpolation and /// Extrapolation interpolation routines for one dimension /// </summary> public class Poly…

第三节-Android10.0 Binder通信原理(三)-ServiceManager篇

1、概述 在Android中&#xff0c;系统提供的服务被包装成一个个系统级service&#xff0c;这些service往往会在设备启动之时添加进Android系统&#xff0c;当某个应用想要调用系统某个服务的功能时&#xff0c;往往是向系统发出请求&#xff0c;调用该服务的外部接口。在上一节…

广告机/商业显示屏_基于MT878安卓主板方案

安卓主板在广告机领域扮演着重要的角色。无论是在商场、车站、酒店、电梯、机场还是高铁站&#xff0c;LED广告机广泛应用&#xff0c;并通过不同方式进行播放和管理。 广告机/商业显示屏_基于MT878安卓主板方案 基于MT8788安卓主板方案的广告机采用了联发科MT8788八核芯片方案…

对比两个数组中对应位置的两个元素将每次对比的最大值用于构成新的数组np.maximum()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 对比两个数组中对应位置的两个元素 将每次对比的最大值用于构成新的数组 np.maximum() 选择题 以下代码的输出结果为&#xff1f; import numpy as np a1 [1,2,33] a2 [11,2,3] print("…

MATLAB - text的两种使用方法

text小技巧 1. 常规使用&#xff08;Method 1&#xff09;2. 在显示画面的相对位置&#xff08;Method 2&#xff09;3. 举个例子 1. 常规使用&#xff08;Method 1&#xff09; text(x,y,txt)2. 在显示画面的相对位置&#xff08;Method 2&#xff09; text(string,‘ABC’,…

使用websocket获取thingsboard设备的实时数据

背景 有一个读者前来咨询,如何实时获取设备的遥测数据。 其实tb是有提供websocket接口来获取设备数据的。而且还支持js跨域调用。下面给大家演示一下。 websocket地址 完整代码 <!DOCTYPE HTML> <html><h

Matplotlib颜色条的配置_Python数据分析与可视化

Matplotlib颜色条配置 基本颜色颜色条选择配色方案颜色条刻度的限制与扩展功能的设置离散型颜色条 基本颜色 Matplotlib提供了8种指定颜色的方法&#xff1a; 在[0&#xff0c;1]中的浮点值的RGB或RGBA元组&#xff08;例如 (0.1, 0.2, 0.5) 或&#xff08;0.1&#xff0c; 0.…

【每日OJ —— 622. 设计循环队列】

每日OJ —— 622. 设计循环队列 1.题目&#xff1a;622. 设计循环队列2.解法2.1.解法讲解2.1.1.算法讲解2.1.2.代码实现2.1.3.提交通过展示 1.题目&#xff1a;622. 设计循环队列 2.解法 1.本题有很多解法&#xff1a;可以使用数组&#xff0c;单链表&#xff0c;双链表&#x…

2023亚太杯数学建模赛题人工精准翻译

大家好&#xff0c;亚太杯今天早上6点已经开赛啦&#xff0c;然后我在这里给大家带来赛题的精准人工翻译&#xff0c;防止大家直接用软件翻译导致某些地方乱码或者翻译不精准&#xff0c;这会导致后续做题过程出现很大偏差。 注意&#xff0c;以下翻译均免费发放word形式的哈&…

【精选】CSS入门必看知识点大合集

CSS简介 CSS概念 CSS&#xff08;Cascading Style Sheets&#xff09;层叠样式表&#xff0c;又叫级联样式表&#xff0c;简称样式表 CSS文件后缀名为.css CSS用于HTML文档中元素样式的定义 为什么需要CSS 使用css的唯一目的就是让网页具有美观一致的页面 语法 CSS 规则…

DB2—03(DB2中常见基础操作)

DB2—03&#xff08;DB2中常见基础操作&#xff09; 1. 前言1.1 oracle和mysql相关 2. db2中的"dual"2.1 SYSIBM.SYSDUMMY12.2 使用VALUES2.3 SYSIBM.SYSDUMMY1 "变" dual 3. db2中常用函数3.1 nvl()、value()、COALESCE()3.2 NULLIF() 函数3.3 LISTAGG() …

论文《Unsupervised Dialog Structure Learning》笔记:详解DD-VRNN

D-VRNN模型和DD-VRNN模型 总体架构 离散-可变循环变分自编码器&#xff08;D-VRNN&#xff09;和直接-离散-可变循环变分自编码器&#xff08;DD-VRNN&#xff09;概述。D-VRNN和DD-VRNN使用不同的先验分布来建模 z t z_t zt​之间的转换&#xff0c;如红色实线所示。 x t x_t…

Rust错误处理:Result

文章目录 简介错误匹配 Rust基础教程&#xff1a; 初步⚙ 所有权⚙ 结构体和枚举类⚙ 函数进阶⚙ 泛型和特征⚙ 并发和线程通信⚙ cargo包管理⚙ 可空类型Option Rust进阶教程&#xff1a; 用宏实现参数可变的函数⚙ 类函数宏 简介 Rust中没有提供类似try…catch之类…

【亚太杯思路助攻】2023年第十三届APMCM亚太地区大学生数学建模竞赛——(文末领取方式)

2023年第十三届APMCM亚太地区大学生数学建模竞赛——正式开赛&#xff01;&#xff01;&#xff01; 赛题已由高分雅思学姐翻译完成&#xff0c;我们的O奖学长也在第一时间分析了赛题&#xff0c;帮助大家最快时间&#xff0c;选择最适合是自己的赛题。 B题 C题 祝各位小伙伴都…

[Android]使用Retrofit进行网络请求

以下是使用 Retrofit 发送 POST 请求获取分页城市列表的 Kotlin 代码示例 1.在你的 build.gradle 文件中添加 Retrofit 和 Gson 的依赖 dependencies {......implementation("com.squareup.retrofit2:retrofit:2.9.0")implementation("com.squareup.retrofit2…

排序算法--归并排序

实现逻辑 ① 将序列每相邻两个数字进行归并操作&#xff0c;形成floor(n/2)个序列&#xff0c;排序后每个序列包含两个元素 ② 将上述序列再次归并&#xff0c;形成floor(n/4)个序列&#xff0c;每个序列包含四个元素 ③ 重复步骤②&#xff0c;直到所有元素排序完毕 void pri…

JVM垃圾回收相关算法

目录 一、前言 二、标记阶段&#xff1a;引用计数算法 三、标记阶段&#xff1a;可达性分析算法 &#xff08;一&#xff09;基本思路 &#xff08;二&#xff09;GC Roots对象 四、对象的finalization机制 五、MAT与JProfiler的GC Roots溯源 六、清除阶段&#xff1a;…

基于PCA算法的点云平面拟合

平面拟合 1、平面拟合2、参考文献3、相关代码 1、平面拟合 PCA 是一种数学变换的方法&#xff0c;利用降维的思想在变换中保持变量的总方差不变&#xff0c;将给定的一组变量线性变换为另一组不相关的变量&#xff0c;并且使变换后的第一变量的方差最大&#xff0c;即第一主成分…