LC 410. 分割数组的最大值

410. 分割数组的最大值

难度: 困难

题目大意:

给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组。

设计一个算法使得这 k 个子数组各自和的最大值最小。

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 10^6
  • 1 <= k <= min(50, nums.length)

示例 1:

输入:nums = [7,2,5,10,8], k = 2
输出:18
解释:
一共有四种方法将 nums 分割为 2 个子数组。 
其中最好的方式是将其分为 [7,2,5] 和 [10,8] 。
因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。

分析

类似"最大值最小"这样的字眼就可以往二分法上面去思考,那么怎么来进行二分呢,二分的话肯定是要有单调性的,本题是要怎么划分才可以使各自和的最大值最小,那么如果和越大,我们就可以把更多的数放在一组里面,也就是说组越少,同理,如果和越小,我们可以放在同一组里面的数字肯定就更少,也就是说组越多,这样就找单调性,我们可以二分这个值,这个值的区间是多少呢?显然不能小于数组中的最大值,不能大于数组的和,所以我们就确定了上下界,那么思考怎么如果确定了每一组的最大值,怎么求划分的组数呢?我们贪心的做,从前往后枚举,用一个变量累计和,如果和大于当前二分的值,那么就把前面的枚举的数字当成一组,如果组数小于k,那么说明当前二分的值小了,返回false即可,如果大于等于k,那么说明还是可以往下压缩的,返回true

二分查找 + 贪心

class Solution {
public:int splitArray(vector<int>& nums, int k) {int n = nums.size();function<bool(int)> check = [&](int mid) {int sum = 0, res = 1; for (int i = 0; i < nums.size(); i++) {if (sum + nums[i] > mid) {res ++;sum = nums[i];} else {sum += nums[i];}}return res <= k;};int l = *max_element(nums.begin(), nums.end());int r = accumulate(nums.begin(), nums.end(), 0);while (l < r) {int mid = l + r >> 1;if (check(mid)) r = mid;else l = mid + 1;}return l;}
};

时间复杂度: O ( n l o g ( r − l ) ) O(nlog(r - l)) O(nlog(rl))

分析

状态定义:我们令f[i][j]表示将前i个数中分成j组,每组和的最大值的最小值

那么状态怎么转移呢?以最后一个不同点为分界点,也就是说,最后一组的起始点,我们可以枚举一下最后一组的起始点,假设当前枚举的是第i个数,要分成j组,最后一组的起始点是u,最后一组的和是sum,那么状态转移方程就是f[i][j] = min(f[i][j], max(f[u - 1][j - 1], sum));状态转移方程出来了,代码就好写了,最初初始化为INFf[0][0] = 0

朴素版 动态规划

class Solution {
public:int splitArray(vector<int>& nums, int k) {int n = nums.size();// 前i个数字中分成j组各自和的最大值的最小值vector<vector<int>> f(n + 1, vector<int>(k + 1, 0x3f3f3f3f));f[0][0] = 0; for (int i = 1; i <= n; i ++) {for (int j = 1; j <= i && j <= k; j ++) {int sum = 0;for (int u = i; u ; u --) {sum += nums[u - 1];f[i][j] = min(f[i][j], max(f[u - 1][j - 1], sum));}}}return f[n][k];}
};

时间复杂度: O ( n 2 ∗ k ) O(n^2 * k) O(n2k)

动态规划 + 前缀和

class Solution {
public:int splitArray(vector<int>& nums, int k) {int n = nums.size();vector<vector<int>> f(n + 1, vector<int>(k + 1, 0x3f3f3f3f));vector<int> s(n + 1);// 前缀和for (int i = 1; i <= n; i ++) s[i] = s[i - 1] + nums[i - 1]; f[0][0] = 0; for (int i = 1; i <= n; i ++) {for (int j = 1; j <= i && j <= k; j ++) {for (int u = i; u ; u --) {f[i][j] = min(f[i][j], max(f[u - 1][j - 1], s[i] - s[u - 1]));}}}return f[n][k];}
};

时间复杂度: O ( n 2 ∗ k ) O(n^2 * k) O(n2k)

和上面的做法没有本质区别,只是加上了一个前缀和,优化一些计算

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

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

相关文章

11- OpenCV:自定义线性滤波(卷积,卷积边缘)

目录 一、卷积 1、卷积概念 2、卷积如何工作 3、常见算子&#xff08;卷积核 Kenel&#xff09; 4、自定义卷积模糊 5、代码演示 二、卷积边缘 1、卷积边缘问题 2、处理边缘 3、相关的API说明 4、代码演示 一、卷积 1、卷积概念 &#xff08;1&#xff09;在OpenC…

执行计划操作符(DM8.1 20231113)

达梦数据库执行计划操作符 环境介绍 环境介绍 数据库版本 DM8.1 20231113达梦数据库学习使用列表 - 点击跳转 操作符名称参数说明操作说明AAGR2grp_num&#xff1a;分组项个数 / sfun_num&#xff1a;返回上层操作符的集函数个数/distinct_flag&#xff1a;集函数参数是否去重…

生成当天递增唯一的流水号的几种方式

说明&#xff1a;当开发中&#xff0c;如交易、文件传输过程中的文件名&#xff0c;可能需要我们使用一串唯一的数字来锁定这一条“交互记录”&#xff0c;即流水号。 本文介绍几种生成6位递增唯一&#xff0c;且每日重置的流水号的方式。 方式一&#xff1a;使用Redis 我们…

模仿ProTable创建ProTable组件

不多说废话直接上代码 父组件 // index.jsx/*** description 此ProTable是根据ProComponents里的ProTable模仿封装的简易版本* */ import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useState } from react import { Card, Table } from antd import…

SpringSecurity(11)——核心组件和认证流程

获取用户信息 // 获取安全上下文对象&#xff0c;就是那个保存在 ThreadLocal 里面的安全上下文对象 // 总是不为null(如果不存在&#xff0c;则创建一个authentication属性为null的empty安全上下文对象) SecurityContext securityContext SecurityContextHolder.getContext(…

微信轰炸-python实现方法

新手&#xff0c;一般都需要执行以下命令&#xff0c;用来导入对应模块 pip install -i Simple Index pynput 键盘winr进入输入cmd 执行该命令即可&#xff1a;pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pynput 打开pycharm,输入代码如下 from pynput.keybo…

AI视频智能识别技术在智慧农业大棚升级改造管理场景中的应用方案

一、需求分析 随着科技的进步和农业现代化的推进&#xff0c;智能化技术逐渐成为现代农业发展的重要支撑。农业大棚作为现代农业的重要组成部分&#xff0c;其智能化改造对于提高农业生产效率、降低成本、增加收益具有重要意义。利用先进的信息化手段来对农业大棚进行管理&…

NOC总线(2)

1. NoC的路由 在NoC交换信息时&#xff0c;需要确定从源节点到目标节点所经过的路径&#xff0c;这时就需要路由算法来确定该路径。路由算法分为静态路由算法和动态路由算法两种。 静态路由算法对于两节点之间的路径是固定的&#xff0c;结构简单&#xff0c;便于硬件实…

【算法分析与设计】二叉树的层序遍历

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xf…

idea插件开发

1&#xff0c; file-new project 如图&#xff0c;选择了安装路径&#xff0c;报错【select home directory for intellij platform plugin sdk】。&#xff08;注意是安装路径最外层的文件夹&#xff0c;不是里面的lib&#xff0c;jbr这一层级&#xff09; 2&#xff0c;点击了…

HTML前端CSS实现只显示1行或者2行、3行剩余显示省略号

想要做的效果: 文本只一行显示 /**实现思路&#xff1a;1.设置inline-block属相2.强制不换行3.固定高度4.隐藏超出部分5.显示“……”*/ {display: inline-block;white-space: nowrap; width: 100%; overflow: hidden;text-overflow:ellipsis; }文本只多行显示 /** 实现思路&…

spring boot集成redis,以及配置database不生效问题

备注&#xff1a;记录一次spring-boot redis 配置redis.database后&#xff0c;仍然使用db0默认库的情况。 springboot集成redis及相关问题 1. spring boot集成redisredis集成依赖&#xff1a;redis配置序列化 2. 集成redission redis分布式锁等快捷管理工具集成依赖配置注入…

【Java发送邮箱】spring boot 发送邮箱

导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency> 2.在properties配置邮箱 # 发件人QQ号 spring.mail.username2508575653qq.com # QQ邮箱授权码 sp…

分享一个asio下使用channel来实现无需队列的安全的连续async_write的方法

分享一个asio下使用channel来实现无需队列的安全的连续async_write的方法 问题&#xff1a;不能直接用asio::async_write连续发送数据 下面这段代码是错误的(为了代码的可读性和易理解&#xff0c;请先忽略函数调用中参数不正确的问题)&#xff1a; asio::async_write(sock,…

xshell配置隧道转移规则

钢铁知识库&#xff0c;一个学习python爬虫、数据分析的知识库。人生苦短&#xff0c;快用python。 xshell是什么 通俗点说就是一款强大ssh远程软件&#xff0c;可以方便运维人员对服务器进行管理操作&#xff0c;功能很多朋友们自行探索&#xff0c;今天只聊其中一个功能点那…

Numpy笔记:安装Numpy+ndarray基本属性+常用方法+索引和切片+广播+轴+范数

Numpy Python库&#xff0c;用于数组快速操作的各种API 支持常见的数组和矩阵操作ndarray处理多维数组 安装Numpy 检查PyCharm的Python运行环境 File–>Settings–>Project–>Python Interpreter检查Python Interpreter环境&#xff0c;例如base 点击Anaconda Prom…

从0开始学习C++ 第三十课 插入排序和快速排序

插入排序 (Insertion Sort) 概念&#xff1a; 插入排序是一种简单直观的排序算法&#xff0c;它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。 逐步分析&#xff1a; 从数组第二个元素开…

HNU-数据挖掘-实验2-数据降维与可视化

数据挖掘课程实验实验2 数据降维与可视化 计科210X 甘晴void 202108010XXX 文章目录 数据挖掘课程实验<br>实验2 数据降维与可视化实验背景实验目标实验数据集说明实验参考步骤实验过程1.对数据进行初步降维2.使用无监督数据降维方法&#xff0c;比如PCA&#xff0c;I…

既是API调试平台也是自动化测试工具?Apipost

Apipost提供可视化的API自动化测试功能&#xff0c;使用Apipost研发人员可以设计、调试接口&#xff0c;测试人员可以基于同一数据源进行测试&#xff0c;Apipost 接口自动化功能在上次更新中进行了逻辑调整&#xff0c;带来更好的交互操作、更多的控制器选择&#xff0c;同时新…

代码随想录算法训练营第四十一天 | 343.整数拆分、66.不同的二叉搜索树

343.整数拆分 题目链接&#xff1a;343.整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 文章讲解/视频讲解&#xff1a;https://programmerca…