代码学习记录26----贪心算法

随想录日记part26【把这两天没写的补回来】

t i m e : time: time 2024.03.22-24



主要内容:今天开始学习贪心算法,基础知识可以看链接,:接下来是针对题目的讲解:1.分配饼干 ;2.摆动序列 ;3.最大子序列和;4.买卖股票的最佳时机II;5.跳跃游戏;6.跳跃游戏II

  • 455.分发饼干
  • 376. 摆动序列
  • 53. 最大子序和
  • 122.买卖股票的最佳时机II
  • 55. 跳跃游戏
  • 45.跳跃游戏 II


Topic1分发饼干

题目:

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i i i,都有一个胃口值 g [ i ] g[i] g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j j j,都有一个尺寸 s [ j ] s[j] s[j] 。如果 s [ j ] > = g [ i ] s[j] >= g[i] s[j]>=g[i],我们可以将这个饼干 j j j 分配给孩子 i i i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

输入: g = [ 1 , 2 , 3 ] , s = [ 1 , 1 ] g = [1,2,3], s = [1,1] g=[1,2,3],s=[1,1]
输出: 1 1 1

思路:
可以尝试使用贪心策略,先将饼干数组和小孩数组排序。
然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。

在这里插入图片描述
代码如下:

class Solution {
//优先考虑胃口,先喂饱大胃口public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int index = s.length - 1;int result = 0;for (int i = g.length - 1; i >= 0; i--) {if (index >= 0 && s[index] >= g[i]) {index--;result++;}}return result;}
}

时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度 O ( 1 ) O(1) O(1)



Topic2摆动序列

题目:

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。例如, [ 1 , 7 , 4 , 9 , 2 , 5 ] [1, 7, 4, 9, 2, 5] [1,7,4,9,2,5] 是一个 摆动序列 ,因为差值 ( 6 , − 3 , 5 , − 7 , 3 ) (6, -3, 5, -7, 3) (6,3,5,7,3) 是正负交替出现的。相反, [ 1 , 4 , 7 , 2 , 5 ] [1, 4, 7, 2, 5] [1,4,7,2,5] [ 1 , 7 , 4 , 5 , 5 ] [1, 7, 4, 5, 5] [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。子序列可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。给你一个整数数组 n u m s nums nums ,返回 n u m s nums nums 中作为摆动序列的最长子序列的长度 。

输入: n u m s = [ 1 , 7 , 4 , 9 , 2 , 5 ] nums = [1,7,4,9,2,5] nums=[1,7,4,9,2,5]
输出: 6 6 6

思路:

局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值。
整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列
在这里插入图片描述

所以整体代码如下:

class Solution {public int wiggleMaxLength(int[] nums) {int count = 1;// 记录摆动个数int pre = 0;int aft = 0;if (nums.length < 1)return 1;for (int i = 0; i < nums.length - 1; i++) {aft = nums[i + 1] - nums[i];if ((pre >= 0 && aft < 0) || (pre <= 0 && aft > 0)) {count++;}pre = aft;}return count;}
}


Topic3最大子序和

题目:
给你一个整数数组 n u m s nums nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。

输入: n u m s = [ − 2 , 1 , − 3 , 4 , − 1 , 2 , 1 , − 5 , 4 ] nums = [-2,1,-3,4,-1,2,1,-5,4] nums=[2,1,3,4,1,2,1,5,4]
输出: 6 6 6
解释: 连续子数组 [ 4 , − 1 , 2 , 1 ] [4,-1,2,1] [4,1,2,1] 的和最大为 6 6 6
思路:

局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。
全局最优:选取最大“连续和”
代码实现如下:

class Solution {public int maxSubArray(int[] nums) {int result=Integer.MIN_VALUE;int count=0;for(int i=0;i<nums.length;i++){count+=nums[i];if(result<count)result=count;if(count<0)count=0;}return result;}
}

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)



Topic4买卖股票的最佳时机 II

题目:
给你一个整数数组 p r i c e s prices prices ,其中 p r i c e s [ i ] prices[i] prices[i] 表示某支股票第 i i i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持有一股股票。你也可以先购买,然后在同一天出售。返回你能获得的最大利润

输入: p r i c e s = [ 7 , 1 , 5 , 3 , 6 , 4 ] prices = [7,1,5,3,6,4] prices=[7,1,5,3,6,4]
输出: 7 7 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。总利润为 4 + 3 = 7
思路:

这道题目可能我们只会想,选一个低的买入,再选个高的卖,再选一个低的买入…循环反复
代码实现如下:

class Solution {public int maxProfit(int[] prices) {int result=0;for(int i=1;i<prices.length;i++){result+=Integer.max(0,prices[i]-prices[i-1]);}return result;}
}

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)



Topic5跳跃游戏

题目:
给你一个非负整数数组 n u m s nums nums ,你最初位于数组的第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回 t r u e true true ;否则,返回 f a l s e false false

输入: n u m s = [ 2 , 3 , 1 , 1 , 4 ] nums = [2,3,1,1,4] nums=[2,3,1,1,4]
输出: t r u e true true
解释: 可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标
思路:

贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。
在这里插入图片描述

代码实现如下:

class Solution {public boolean canJump(int[] nums) {int result = 0;if (nums.length <= 1)return true;for (int i = 0; i <= result; i++) {result = Integer.max(result, i + nums[i]);if (result >= nums.length - 1)return true;}if (result >= nums.length - 1)return true;elsereturn false;}
}

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)



Topic6跳跃游戏||

题目:
给定一个长度为 n n n 的 0 索引整数数组 n u m s nums nums。初始位置为 n u m s [ 0 ] nums[0] nums[0]。每个元素 n u m s [ i ] nums[i] nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 n u m s [ i ] nums[i] nums[i] 处,你可以跳转到任意 n u m s [ i + j ] nums[i + j] nums[i+j] 处:
0 < = j < = n u m s [ i ] 0 <= j <= nums[i] 0<=j<=nums[i]
i + j < n i + j < n i+j<n
返回到达 n u m s [ n − 1 ] nums[n - 1] nums[n1] 的最小跳跃次数。生成的测试用例可以到达 n u m s [ n − 1 ] nums[n - 1] nums[n1]

输入: n u m s = [ 2 , 3 , 1 , 1 , 4 ] nums = [2,3,1,1,4] nums=[2,3,1,1,4]
输出: 2 2 2
解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
思路:

要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖。
在这里插入图片描述

代码实现如下:

class Solution {public int jump(int[] nums) {if (nums.length <= 1)return 0;int now = 0;int next = 0;int step = 0;for (int i = 0; i < nums.length; i++) {next = Integer.max(next, nums[i] + i);if (now == i) {step++;now = next;if (next >= nums.length - 1)break;}}return step;}
}

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

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

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

相关文章

继承和多态(1)(继承部分)

继承 继承的概念 上文就是继承的概念。 必须记住父类也可以称为基类&#xff0c;超类。 子类也可以称为派生类。 继承的语法 在Java中如果要表示类之间的继承关系&#xff0c;需要借助extends关键字&#xff0c;具体如下&#xff1a; 修饰符 class 子类 extends 父类 {//…

网易web安全工程师进阶版课程

课程介绍 《Web安全工程师&#xff08;进阶&#xff09;》是由“ i春秋学院联合网易安全部”出品&#xff0c;资深讲师团队通过精炼的教学内容、丰富的实际场景及综合项目实战&#xff0c;帮助学员纵向提升技能&#xff0c;横向拓宽视野&#xff0c;牢靠掌握Web安全工程师核心…

pycharm搭建新的解释器及删除处理

目录 1.创建虚拟环境 个人实际操作&#xff1a; 对于“继承全局站点包”&#xff1a; 2.创建一个新项目 3.删除操作 &#xff08;1&#xff09;删除解释器 &#xff08;2&#xff09;删除新建项目 1.创建虚拟环境 Pycharm官方文档说明网址&#xff1a; Configure a virt…

【机器学习】包裹式特征选择之序列前向选择法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

向开发板上移植ip工具:交叉编译 ip工具

一. 简介 前面几篇文章学习了 CAN设备节点的创建&#xff0c;以及如何使能 CAN驱动。 本文学习向开发板上移植ip工具。 二. 向开发板上移植ip工具&#xff1a;交叉编译 ip工具 注意&#xff1a;在移植 ip 命令的时候必须先对根文件系统做个备份&#xff01;防止操作失误导…

ffmpeg实现媒体流解码

本期主要讲解怎么将MP4媒体流的视频解码为yuv,音频解码为pcm数据;在此之前我们要先了解解复用和复用的概念; 解复用:像mp4是由音频和视频组成的(其他内容流除外);将MP4的流拆分成视频流(h264或h265等)和音频流(AAC或mp3等); 复用:就是将音频和视频打包成MP4或者fl…

我重新理解了《重构》

我重新理解了《重构》 重构的定义 《重构&#xff1a;改善既有代码的设计》 书中给出了重构的定义&#xff1a;对软件内部结构的一种调整&#xff0c;目的是在不改变软件可观察前提下&#xff0c;提高其可理解性&#xff0c;降低其修改成本。每个人对重构有自己的理解&#x…

Cobalt Strike -- 各种beacon

今天来讲一下cs里面的beacon 其实cs真的功能很强大&#xff0c;自带代理创建&#xff0c;自带beacon通信&#xff01;&#xff01;&#xff01; 一张图&#xff0c;就能说明beacon的工作原理 1.Beacon 每当有一台机器上线之后&#xff0c;我们都会选择sleep时间&#xff0c;…

吴恩达2022机器学习专项课程(一) 3.6 可视化样例

问题预览 1.本节课主要讲的是什么&#xff1f; 2.不同的w和b&#xff0c;如何影响线性回归和等高线图&#xff1f; 3.一般用哪种方式&#xff0c;可以找到最佳的w和b&#xff1f; 解读 1.课程内容 设置不同的w和b&#xff0c;观察模型拟合数据&#xff0c;成本函数J的等高线…

linux命令(CentOS7)yum provides

在linux(CentOS7)服务器中&#xff0c;当执行某命令时&#xff0c;如果该命令不存在&#xff0c;会打印出“-bash: xxx: command not found”。 [rootelasticsearch ~]# shasum -bash: shasum: command not found [rootelasticsearch ~]# 使用yum install command安装其对应的…

nodejs+vue高校洗浴管理系统python-flask-django-php

高校洗浴管理系统采用数据库是MySQL。网站的搭建与开发采用了先进的nodejs进行编写&#xff0c;使用了express框架。该系统从两个对象&#xff1a;由管理员和学生来对系统进行设计构建。主要功能包括&#xff1a;个人信息修改&#xff0c;对学生管理、浴室信息、浴室预约、预约…

【JavaEE初阶系列】——阻塞队列

目录 &#x1f6a9;阻塞队列的定义 &#x1f6a9;生产者消费者模型 &#x1f388;解耦性 &#x1f388;削峰填谷 &#x1f6a9;阻塞队列的实现 &#x1f4dd;基础的环形队列 &#x1f4dd;阻塞队列的形成 &#x1f4dd; 内存可见性 &#x1f4dd;阻塞队列代码 &#…

【深度学习】pytorch,MNIST手写数字分类

efficientnet_b0的迁移学习 import torch import torch.nn as nn import torch.optim as optim import torchvision.transforms as transforms from torchvision.datasets import MNIST from torch.utils.data import DataLoader from torchvision import models import matplo…

IntelliJ IDE 插件开发 | (七)PSI 入门及实战(实现 MyBatis 插件的跳转功能)

系列文章 IntelliJ IDE 插件开发 |&#xff08;一&#xff09;快速入门IntelliJ IDE 插件开发 |&#xff08;二&#xff09;UI 界面与数据持久化IntelliJ IDE 插件开发 |&#xff08;三&#xff09;消息通知与事件监听IntelliJ IDE 插件开发 |&#xff08;四&#xff09;来查收…

【mybatis】TypeHandler解读

在谈论MyBatis的源码时&#xff0c;TypeHandler 是其中一个非常关键的组成部分&#xff0c;它负责Java类型和JDBC类型之间的相互转换。理解TypeHandler的工作原理&#xff0c;对于深入理解MyBatis的数据处理流程十分重要。 什么是TypeHandler? 在MyBatis中&#xff0c;TypeH…

android Fragment 生命周期 方法调用顺序

文章目录 Introlog 及结论代码 Intro 界面设计&#xff1a;点击左侧按钮&#xff0c;会将右侧 青色的RightFragment 替换成 黄色的AnotherRightFragment&#xff0c;而这两个 Fragment 的生命周期方法都会打印日志。 所以只要看执行结果中的日志&#xff0c;就可以知道 Fragme…

【单例测试】Mockito实战

目录 一、项目介绍二、业务代码2.1 导入依赖2.2 entity2.3 Dao2.4 业务代码 三、单元测试3.1 生成Test方法3.2 引入测试类3. 3 测试前准备3.4 测试3.4.1 name和phone参数校验3.4.2 测试数据库访问 3.4.3 数据库反例 总结 前面我们提到了《【单元测试】一文读懂java单元测试》 简…

IDEA Android新建项目基础

title: IDEA Android基础开发 search: 2024-03-16 tags: “#JavaAndroid开发” 一、构建基本项目 在使用 IDEA 进行基础的Android 开发时&#xff0c;我们可以通过IDEA自带的新建项目功能进行Android应用开发基础架构的搭建&#xff0c;可以直接找到 File --> New --> …

vue的history路由实现形式

vue的路由实现形式 SPA single page web application&#xff0c;单页Web应用 简单的说SPA就是一个WEB项目只有一个HTML页面&#xff0c;一旦页面加载完成&#xff0c;SPA不会因为用户的操作而进行页面的重新加载和跳转。取而代之的是利用JS动态的改变HTML的内容&#xff0c…

代码随想录算法训练营day19 | 二叉树阶段性总结

各个部分题目的代码题解都在我往日的二叉树的博客中。 (day14到day22) 目录 二叉树理论基础二叉树的遍历方式深度优先遍历广度优先遍历 求二叉树的属性二叉树的修改与制造求二叉搜索树的属性二叉树公共最先问题二叉搜索树的修改与构造总结 二叉树理论基础 二叉树的理论基础参…