【LeetCode: 410. 分割数组的最大值 | 暴力递归=>记忆化搜索=>动态规划 】

| 🚀 算法题 🚀 |
🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯
| 🚀 算法题 🚀 |

🍔 目录
- 🚩 题目链接
- ⛲ 题目描述
- 🌟 求解思路&实现代码&运行结果
- ⚡ 暴力法
- 🥦 求解思路
- 🥦 实现代码
- 🥦 运行结果
- ⚡ 记忆化搜索
- 🥦 求解思路
- 🥦 实现代码
- 🥦 运行结果
- ⚡ 动态规划
- 🥦 求解思路
- 🥦 实现代码
- 🥦 运行结果
- 💬 共勉
🚩 题目链接
- 410. 分割数组的最大值
⛲ 题目描述
给定一个非负整数数组 nums 和一个整数 m ,你需要将这个数组分成 m 个非空的连续子数组。
设计一个算法使得这 m 个子数组各自和的最大值最小。
示例 1:
输入:nums = [7,2,5,10,8], m = 2
输出:18
解释:
一共有四种方法将 nums 分割为 2 个子数组。
其中最好的方式是将其分为 [7,2,5] 和 [10,8] 。
因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。
示例 2:
输入:nums = [1,2,3,4,5], m = 2
输出:9
示例 3:
输入:nums = [1,4,4], m = 3
输出:4
提示:
1 <= nums.length <= 1000
0 <= nums[i] <= 106
1 <= m <= min(50, nums.length)
🌟 求解思路&实现代码&运行结果
⚡ 暴力法
🥦 求解思路
- 简单概括题目的意思:我们需要将给定的数组nums划分为k个子数组,然后找到每一次可以进行划分方案中的最大值,然后将所有可行的方案中的最小值找出来即可。
- 怎么做呢?我们就可以枚举每一个开始的位置i,通过前缀和快速求解从left到i位置子数组的和,然后递归去求后面重复子规模的结果。
- 有了基本的思路,接下来我们就来通过代码来实现一下。
🥦 实现代码
class Solution {int[] sum;int[] nums;int k;int n;public int splitArray(int[] nums, int k) {this.n=nums.length;this.nums=nums;this.k=k;sum=new int[n+1];for(int i=1;i<=n;i++){sum[i]=sum[i-1]+nums[i-1];}return process(0,0);}public int process(int left,int cnt){if(cnt+1==k){return sum[n]-sum[left]; }int min=Integer.MAX_VALUE;for(int i=left;i<nums.length;i++){int max=Math.max(sum[i+1]-sum[left],process(i+1,cnt+1));min=Math.min(min,max);}return min;}
}
🥦 运行结果
时间超出了限制,但是不要紧张,这是我们想要的结果!

⚡ 记忆化搜索
🥦 求解思路
- 因为在递归的过程中,会重复的出现一些多次计算的结果,我们通过开辟一个数组,将结果提前缓存下来,算过的直接返回,避免重复计算,通过空间来去换我们的时间。
🥦 实现代码
class Solution {int[] sum;int[] nums;int k;int[][] dp;int n;public int splitArray(int[] nums, int k) {this.n=nums.length;this.nums=nums;this.k=k;sum=new int[n+1];dp=new int[n+1][k+1];for(int i=0;i<=n;i++) Arrays.fill(dp[i],-1);for(int i=1;i<=n;i++){sum[i]=sum[i-1]+nums[i-1];}return process(0,0);}public int process(int left,int cnt){if(cnt+1==k){return sum[n]-sum[left]; }if(dp[left][cnt]!=-1) return dp[left][cnt];int min=Integer.MAX_VALUE;for(int i=left;i<nums.length;i++){int max=Math.max(sum[i+1]-sum[left],process(i+1,cnt+1));min=Math.min(min,max);}return dp[left][cnt]=min;}
}
🥦 运行结果
通过缓存,将重复计算的结果缓存下来,通过。
时间情况

空间情况

⚡ 动态规划
🥦 求解思路
- 有了递归,有了记忆化搜索,接下来就是动态规划了,直接上手。
🥦 实现代码
class Solution {int[] sum;int[] nums;int k;int[][] dp;int n;public int splitArray(int[] nums, int k) {this.n=nums.length;this.nums=nums;this.k=k;sum=new int[n+1];dp=new int[n+1][k+1];for(int i=1;i<=n;i++){sum[i]=sum[i-1]+nums[i-1];}for(int i = 0; i <= n; i++){Arrays.fill(dp[i], Integer.MAX_VALUE);}dp[n][k]=0;for(int left=n-1;left>=0;left--){for(int cnt=k-1;cnt>=0;cnt--){int min=Integer.MAX_VALUE;for(int i=left;i<n;i++){int max=Math.max(sum[i+1]-sum[left],dp[i+1][cnt+1]);min=Math.min(min,max);}dp[left][cnt]=min;}}return dp[0][0];}
}
🥦 运行结果
动态规划搞定,大家可以积极的尝试。
时间复杂度

空间复杂度

💬 共勉
| 最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |


相关文章:
【LeetCode: 410. 分割数组的最大值 | 暴力递归=>记忆化搜索=>动态规划 】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
内核对象和两种同步
概念 Windows 中每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核进 行访问 它的所有者:内核对象的所有者是操作系统内核,而非进程,也就是说当进程退出,内核对象不一定会销毁 法…...
水表远程监控系统有什么功能吗?
水表远程监控系统是通过远程传输水表数据,实现对水表的远程监控和管理的一种智能化系统。它主要具备以下功能: 1.远程抄表功能:通过远程传输技术,实现对水表的远程抄表和监控,无需人工上门抄表,节省人力成本…...
zabbix自定义监控
一、案例操作:自定义监控内容 案列:自定义监控客户端服务器登录的人数 需求:限制登录人数不超过 3 个,超过 3 个就发出报警信息 1、自定义监控内容的操作步骤 1.1 在客户端创建自定义 key 明确需要执行的 linux 命令 who | …...
【AUTOSAR】Com通讯栈配置说明(四)---- Nm模块
Nm模块 NmGlobalConfig NmGlobalConstants NmRxIndicationCallback: callback 函数 NmCycletimeMainFunction:Nm 主函数调用周期 NmDevErrorDetect: 是否支持DET NmVersionInfoApi: 是否支持获取版本信息api PduR模块 PduRBswModules PduRBswModuleRef:关联的BS…...
IMG CXM GPU:面向复杂消费级设备的无缝视觉体验
上周我们推出了一款新的GPU,即IMG CXM。它的三种配置可扩展,为可穿戴设备和高级数字电视等多种消费设备提供无缝用户界面。 消费级设备需要GPU提供什么? 涵盖智能手表和智能眼镜的可穿戴市场为移动中的消费者提供了易于访问的信息。鉴于屏幕尺…...
Kafka如何保证数据高可靠
Kafka它本身其实不是一个金融级别数据可靠的分布式消息系统。 虽然说它存储到某个topic里的数据会先拆分多个partition,这体现了分治的一个思想。每一个partition在最终存储的时候会保存多个副本,不同的副本存储在不同的节点。这样的话任意一个节点挂掉…...
OpenWRT 中修改SSID的文件
文件位置:/....../package/ramips/drivers/mt7628/files/mt7628.sh //---------------------------------------------文件中option ssid处修改如下: detect_mt7628() { # detect_ralink_wifi mt7628 mt7628 ssidmt7628-ifconfig eth0 | grep H…...
如何在 Linux 中进行网络地址转换 (NAT)?
网络地址转换(Network Address Translation,简称NAT)是一种在网络中使用的技术,它允许将私有网络中的IP地址映射到公共网络上,从而实现多个设备共享单个公共IP地址。在Linux系统中,我们可以使用一些工具和配…...
redis的使用第一章
下载地址:http://redis.io/download 安装步骤: 1.安装gcc yum install gcc2.把下载好的redis‐5.0.3.tar.gz放在/usr/local文件夹下,并解压 wget http://download.redis.io/releases/redis‐5.0.3.tar.gz tar xzf redis‐5.0.3.tar.gz cd r…...
基于springboot+vue的校园二手交易市场
一、项目背景介绍: 校园二手交易市场是大学生生活中的重要组成部分,它为学生提供了一个便捷的方式来买卖物品。然而,传统的校园二手交易方式存在着信息不对称、交易风险高等问题。为了解决这些问题,基于Spring Boot和Vue的校园二手…...
【CH32】| 01——新建工程 | 下载 | 运行 |调试
系列文章目录 【CH32】| 00——开发环境搭建 【CH32】| 01——新建工程 | 下载 | 运行 |调试 失败了也挺可爱,成功了就超帅。 文章目录 1. 新建工程1.1 基于官方IDE [MounRiver Studio]1.1.1 使用官方内置的工程模板新建1.1.2 使用自定义工程模板新建1.1.2.1 新建自…...
【Netty】Promise 源码分析(十七)
文章目录 前言一、Promise 接口二、Netty 的 DefaultPromise2.1、设置任务的成功或失败2.2、获取 Future 任务执行结果和添加监听事件 三、Netty 的 DefaultChannelPromise总结 前言 回顾Netty系列文章: Netty 概述(一)Netty 架构设计&…...
测牛学堂:2023最新自动化软件测试教程之python基础(字符串常用api总结)
python字符串常用API总结 1 count 查找某个字符在整个字符串中出现的次数 2 capitalize 将字符串的第一个字符转换为大写 3 center(width,fillchar) 返回一个指定宽度的字符串,fillchar为填充的字符,默认是空格,常用* str1 分隔线 print(st…...
【信号变化检测】使用新颖的短时间条件局部峰值速率特征进行信号变化/事件/异常检测(Matlab代码实现)
、 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭…...
MQTT GUI 客户端 可视化管理工具
MQTT GUI 客户端 可视化管理工具 介绍 多标签页管理,同时打开多个连接提供原生性能,并且比使用 Electron 等 Web 技术开发的同等应用程序消耗的资源少得多支持 MQTT v5.0 以及 MQTT v3.1.1 协议,支持通过 WebSocket 连接至 MQTT 服务器以树…...
计算机硬件系统 — 冯诺依曼体系结构运行原理解析
目录 文章目录 目录计算机系统计算机硬件系统(冯诺依曼体系结构)PC 主机硬件CPU(中央处理器)CPU 的组成部分CPU 总线控制器单元运算器单元寄存器组超线程与多核架构三级高速缓存为什么需要缓存三级缓存结构 CPU 的指令集指令集的类…...
10.Linux查看文件内容
在 Linux 中,可以使用多种命令来查看文件内容。以下是几个常用的命令及其用法: cat 命令:以行为单位显示整个文件内容。 cat file.txt # 显示名为 file.txt 的文件内容less 命令:分页显示文件内容,可向前/后翻页、搜索…...
API接口测试—详情版(拼多多根据ID取商品详情)
一、为什么要做接口测试 做接口测试的原因主要有以下几个方面: 1. 确保接口功能正确性:接口是不同软件系统或者不同模块之间的数据传输和交互的通道,通过接口测试能够确保不同系统或者模块之间传递的信息准确无误,从而保证了整个…...
【论文阅读】23_SIGIR_Disentangled Contrastive Collaborative Filtering(分离对比协同过滤)
【论文阅读】23_SIGIR_Disentangled Contrastive Collaborative Filtering(分离对比协同过滤) 文章目录 【论文阅读】23_SIGIR_Disentangled Contrastive Collaborative Filtering(分离对比协同过滤)1. 来源2. 介绍3. 模型方法3.1…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
