当前位置: 首页 > news >正文

秋招算法备战第31天 | 贪心算法理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和

贪心算法理论基础

  • 贪心算法并没有固定的套路,唯一的难点就是如何通过局部最优,推出整体最优。
  • 如何验证可不可以用贪心算法呢?最好用的策略就是举反例,如果想不到反例,那么就试一试贪心吧。
  • 刷题或者面试的时候,手动模拟一下感觉可以局部最优推出整体最优,而且想不到反例,那么就试一试贪心。

贪心算法一般分为如下四步:

  • 将问题分解为若干个子问题
  • 找出适合的贪心策略
  • 求解每一个子问题的最优解
  • 将局部最优解堆叠成全局最优解

这个四步其实过于理论化了,我们平时在做贪心类的题目 很难去按照这四步去思考,真是有点“鸡肋”。做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。

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

这是一个经典的贪心算法问题,策略是优先满足胃口小的孩子。具体操作就是先将孩子的胃口数组和饼干尺寸数组排序,然后从小到大匹配。如果当前饼干可以满足当前孩子,就把饼干给孩子,然后移动到下一个孩子和下一个饼干;如果当前饼干无法满足当前孩子,就放弃当前饼干,移动到下一个饼干。

这种算法的理论支持是,如果当前饼干无法满足当前孩子,那么它也无法满足胃口更大的孩子,因此应该放弃。如果可以满足当前孩子,就应该先满足他,因为下一个饼干不一定能满足下一个孩子,但是下一个饼干可能会满足当前孩子或者胃口更大的孩子。

Python实现代码如下:

def findContentChildren(g, s):g.sort()s.sort()child_i = cookie_j = 0while child_i < len(g) and cookie_j < len(s):if s[cookie_j] >= g[child_i]:child_i += 1cookie_j += 1return child_i

在这段代码中,g代表孩子的胃口数组,s代表饼干的尺寸数组。函数返回的是能够满足的孩子数量。数组gs都先进行了排序,然后用两个指针child_icookie_j分别遍历孩子和饼干。如果当前饼干能满足当前孩子,就将饼干给孩子,然后考虑下一个孩子和下一个饼干;否则放弃当前饼干,考虑下一个饼干。这样一直进行,直到没有孩子或者饼干为止。最后返回满足的孩子数量child_i,即为结果。

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

贪心算法

在这个问题中,贪心算法的策略是我们始终尽可能地使序列保持摆动。换句话说,我们总是优先考虑改变趋势,即如果当前是上升的,我们就寻找下一个下降的点,反之亦然。

这个问题实际上是找出数组中的所有"转折点"。一个"转折点"是指该点两侧的差值与该点和其前一点的差值异号。也就是说,如果该点比前一点大,那么它应该比后一点小;反之亦然。

这种策略可以通过一次遍历完成,时间复杂度是O(n)。

Python实现代码如下:

def wiggleMaxLength(nums):n = len(nums)if n < 2:return nprevdiff = nums[1] - nums[0]count = 2 if prevdiff != 0 else 1for i in range(2, n):diff = nums[i] - nums[i - 1]if (diff > 0 and prevdiff <= 0) or (diff < 0 and prevdiff >= 0):count += 1prevdiff = diffreturn count

在这段代码中,nums代表给定的整数数组。函数返回的是最长摆动子序列的长度。首先计算前两个数字的差值prevdiff,然后从第三个数字开始,如果当前数字与前一个数字的差值diffprevdiff异号,说明当前数字是一个转折点,摆动序列长度增加1,然后更新prevdiff为当前的差值。最后返回摆动序列长度count,即为结果。

这个算法的时间复杂度是O(n),空间复杂度是O(1),满足题目的要求。

动态规划

这是一道典型的动态规划问题,我们需要找到数组中的最长摆动子序列的长度。

我们可以维护两个动态规划数组 updown,其中 up[i] 表示在到达数组的第 i 个位置时,最后一次摆动是上升的最长子序列长度,down[i] 表示在到达数组的第 i 个位置时,最后一次摆动是下降的最长子序列长度。

状态转移方程为:

  • 如果 nums[i] > nums[i - 1],那么我们可以在以 i - 1 结尾的下降子序列后面接一个 nums[i],形成一个更长的摆动序列,所以有 up[i] = down[i - 1] + 1down[i] = down[i - 1]
  • 如果 nums[i] < nums[i - 1],那么我们可以在以 i - 1 结尾的上升子序列后面接一个 nums[i],形成一个更长的摆动序列,所以有 down[i] = up[i - 1] + 1up[i] = up[i - 1]
  • 如果 nums[i] == nums[i - 1],那么我们无法在子序列后面接一个 nums[i] 形成一个更长的摆动序列,所以有 up[i] = up[i - 1]down[i] = down[i - 1]

最后的答案就是 up[n - 1]down[n - 1] 的最大值。

Python 代码如下:

def wiggleMaxLength(nums):n = len(nums)if n < 2:return nup = [0] * ndown = [0] * nup[0] = down[0] = 1for i in range(1, n):if nums[i] > nums[i - 1]:up[i] = max(up[i - 1], down[i - 1] + 1)down[i] = down[i - 1]elif nums[i] < nums[i - 1]:up[i] = up[i - 1]down[i] = max(up[i - 1] + 1, down[i - 1])else:up[i] = up[i - 1]down[i] = down[i - 1]return max(up[-1], down[-1])

这段代码中,nums 代表给定的整数数组。函数返回的是最长摆动子序列的长度。数组 updown 存储了以每个位置结尾的最长上升和下降摆动子序列的长度。然后通过状态转移方程更新 updown,最后返回 updown 的最大值,即为最长摆动子序列的长度。

这个算法的时间复杂度是 O(n),空间复杂度是 O(n),满足题目的要求。

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

贪心算法

贪心算法的思路是:遍历数组,并在每个步骤中维护当前的子数组和以及到目前为止找到的最大子数组和。如果当前子数组和变为负数,则在下一个元素处开始新的子数组。

Python实现代码如下:

def maxSubArray(nums):current_sum = max_sum = nums[0]for num in nums[1:]:current_sum = max(num, current_sum + num)max_sum = max(max_sum, current_sum)return max_sum

动态规划

动态规划的思路稍微复杂一些。设dp[i]表示以第i个元素结尾的最大子数组和,那么dp[i]可以由dp[i-1]和nums[i]决定。如果dp[i-1]大于0,dp[i]就等于dp[i-1]加上nums[i],否则等于nums[i]。我们要求的结果就是dp数组中的最大值。

Python实现代码如下:

def maxSubArray(nums):dp = [0] * len(nums)dp[0] = nums[0]for i in range(1, len(nums)):dp[i] = max(dp[i-1] + nums[i], nums[i])return max(dp)

两种算法的时间复杂度都是O(n),空间复杂度上,贪心算法是O(1),动态规划是O(n),如果将动态规划的解法优化一下,可以降低到O(1),因为dp[i]只依赖于dp[i-1]。

优化后的动态规划解法:

def maxSubArray(nums):max_sum = curr_sum = nums[0]for num in nums[1:]:curr_sum = max(curr_sum + num, num)max_sum = max(max_sum, curr_sum)return max_sum

这个解法与贪心算法看起来非常相似,但它们的思考方式是不同的。贪心算法是在每一步都采取局部最优解,而动态规划则是在每一步都根据前一步的结果做出决策。

总结

贪心算法是在每一步都采取局部最优解,而动态规划则是在每一步都根据前一步的结果做出决策。

相关文章:

秋招算法备战第31天 | 贪心算法理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和

贪心算法理论基础 贪心算法并没有固定的套路&#xff0c;唯一的难点就是如何通过局部最优&#xff0c;推出整体最优。如何验证可不可以用贪心算法呢&#xff1f;最好用的策略就是举反例&#xff0c;如果想不到反例&#xff0c;那么就试一试贪心吧。刷题或者面试的时候&#xf…...

页面生成图片或PDF node-egg

没有特别的幸运&#xff0c;那么就特别的努力&#xff01;&#xff01;&#xff01; 中间件&#xff1a;页面生成图片 node-egg 涉及到技术node egg Puppeteer 解决文书智能生成多样化先看效果环境准备初始化项目 目录结构核心代码 完整代码https://gitee.com/hammer1010_ad…...

go常用知识点

go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct 打包一个目录下的多个包时 go build ./… go install ./… 测试时&#xff0c;命令行&#xff1a;go test . //目录下所有单元测试都会执行 go test -v 目录 //测试覆盖率 go test -cover //使用cove…...

ComPDFKit PDF SDK(支持Web、Android、IOS、Windows、Server、API、跨平台)

1. SDK、API是什么&#xff1f; SDK是软件开发工具包的缩写&#xff0c;指的是一组用于开发软件应用的工具、库和文档。SDK包含一系列的函数、类和方法&#xff0c;开发人员可以使用这些工具和资源来开发、测试和部署应用程序。SDK可以提供各种功能和技术支持&#xff0c;如图…...

使用maven容器打包java项目

docker run --rm -v /path/to/your/microservice:/app -w /app maven:latest mvn clean package 解释一下上面的命令&#xff1a; docker run&#xff1a;运行Docker容器。--rm&#xff1a;在容器运行结束后自动删除容器&#xff0c;避免堆积未使用的容器。-v /path/to/you…...

超前端相关的学习网站和一些靠谱的小工具

CSS相关 1. CSS Battle - 在线比拼 CSS https://cssbattle.dev 在线比拼 CSS &#xff0c;一个挺有趣的竞争性游戏&#xff0c;一共有12个级别&#xff0c;需要你用 HTML和 CSS 100%还原它给出的页面&#xff0c;然后再尽量减少代码&#xff0c;你也可以查看全球的排行榜&am…...

uniapp跳转到外部链接

// 一、先配置页面 {"path": "pages/webview/webview","style": {"navigationBarTitleText": ""} } // 二、编写页面 <template><web-view :src"src" /> </template><script> export def…...

初识DBT以及搭建第一个DBT工程

DBT是什么&#xff1a; 按照官方的说法&#xff0c;DBT 是一个数据转换流编排工具。个人理解就是&#xff0c;DBT是帮你编排SQL用的&#xff0c;你可以按照DBT的结构&#xff0c;构建好一个SQL的pipeline&#xff0c;然后让DBT帮你执行这个pipeline。我这里说的SQL pipeline的意…...

Python基于PyTorch实现卷积神经网络回归模型(CNN回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 卷积神经网络&#xff0c;简称为卷积网络&#xff0c;与普通神经网络的区别是它的卷积层内的神经元只覆…...

(AcWing)集合-Nim游戏

给定 n 堆石子以及一个由 k 个不同正整数构成的数字集合 S。 现在有两位玩家轮流操作&#xff0c;每次操作可以从任意一堆石子中拿取石子&#xff0c;每次拿取的石子数量必须包含于集合 S&#xff0c;最后无法进行操作的人视为失败。 问如果两人都采用最优策略&#xff0c;先…...

ConcurrentHashMap源码详解

本文已收录于专栏 《Java》 目录 概念说明数据结构线程安全HashMap示例运行结果ConcurrentHashMap示例运行结果 涉及技术Synchronized概念特性 CAS(Compare And Swap)概念原理代码演示没有使用CAS的代码运行结果使用CAS的代码运行结果 总结提升 概念说明 ConcurrentHashMap是Ja…...

医疗流程自动化盛行,RPA成为医疗保健行业的重点应用技术

随着我们进入新的科技纪元&#xff0c;机器人流程自动化&#xff08;RPA&#xff09;正快速地改变着我们的游戏规则。简单来说&#xff0c;RPA 就是模仿人类与电子系统的互动&#xff0c;自动化执行重复性的任务和操作序列。 医疗保健领域中&#xff0c;RPA 的应用具备巨大的潜…...

Java 版 spring cloud + spring boot 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…...

java重试机制实现方案

本文内容是目前团队内小磊同学对重试机制实现方案的梳理总结。 从为什么需要重试的背景开始&#xff0c;到重试的场景&#xff0c;大致的一些设计思路&#xff0c;最后通过两个成熟的retry组件进行案例讲解&#xff0c;理论实战。 背景 重试是系统提高容错能力的一种手段。在一…...

参数量仅有50KB的超轻量级unet变种网络egeunet【参数和计算量降低494和160倍】医疗图像分割实践

今天看到一篇挺有意思的文章&#xff0c;做的是跟医疗图像分割相关的工作&#xff0c;但是不像之前看到的一些工作一味地去追求高精度&#xff0c;因为医疗领域本身就是一个相对特殊的行业&#xff0c;对于模型产生的结果的精确性要求是很高的&#xff0c;带来的是参数量级的庞…...

Android10 Settings系列(三)根据需求动态添加删除一级菜单、二级菜单的设置项

一 、背景 当时遇到定制需求,需要根据实际需要隐藏Settings的菜单项,于是开始了寻找方法 二 、准备工作 在看了一下源码,经过尝试后,确认生效后,就简单说明一下Settings中布局中主要组成元素 Settings中的菜单项是由 PreferenceScreen 和Preference组成的。其中Prefer…...

51单片机——串行口通信

目录 1、51单片机串口通信介绍 2、串行口相关寄存器 2.1 、串行口控制寄存器SCON和PCON 2.1.1 SCON&#xff1a;串行控制寄存器 (可位寻址) 2.1.2 PCON&#xff1a;电源控制寄存器&#xff08;不可位寻址&#xff09; 2.2、串行口数据缓冲寄存器SBUF 2.3、从机地址控制…...

洛谷题单 Part 6.7.1 矩阵

应队友要求&#xff0c;开始学线性代数&#xff0c;具体路线是矩阵 → \rightarrow →高斯消元 → \rightarrow →线性基。为多项式做个准备 P3390 【模板】矩阵快速幂 题面 板子&#xff0c;用结构体写的&#xff0c;感觉有点丑&#xff0c;一会儿看看题解有没有写得好看的 …...

Spring中c3p0与dbcp配置

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schem…...

Flutter 添加 example流程

一、已有Flutter工程&#xff08;命令&#xff09;添加 example 1、cd 工程(flutter_plugin ,是自己创建的)根目录 例: flutter create example 执行命令创建example PS&#xff1a;cd example 后执行flutter doctor 后就可以看到效果 2、如果需要指定iOS/Android 语言,请添加…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...