【Leetcode】410. 分割数组的最大值

文章目录

  • 题目
  • 思路
    • 1.max_element
    • 2.partial_sum
    • 3.upper_bound
    • 4.distance
  • 代码
  • 运行结果

题目

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

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

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

示例2:
输入:nums = [1,2,3,4,5], k = 2
输出:9

示例3:
输入:nums = [1,4,4], k = 3
输出:4

提示:
1 <= nums.length <= 1000
0 <= nums[i] <= 106
1 <= k <= min(50, nums.length)

思路

这道题我用的方法是二分查找+贪心的做法。这道题目询问的是分组之后最大值的最小情况,这种基本上就是二分的模板的要求,然后再对这个题目进行分析。既然题目要求分组之后最大值尽可能小,那么每一组应该尽可能接近同一个值,假设为x,这就是贪心的思想。

使用贪心算法模拟了数组分割的过程。从数组的开头到结尾进行遍历,利用变量 sum 表示当前分割子数组的和,k 表示需要分割出的子数组的数量(包括当前子数组)。每当 sum 加上当前值超过了某个阈值 x 时,就将当前取的值作为新的一段分割子数组的开头,一直分割 k 次数,一直遍历到最后还没有分割完直接退出。遍历结束后,验证分割 k 次之后数组还有没有未分割的数。这一方法采用贪心策略,每次都选择当前能满足要求的子数组,以尽可能满足题目的条件。

采用二分查找的方法来解决问题。二分查找的上界设定为数组 nums 中所有元素的和,下界为数组 nums 中所有元素的最大值。通过进行二分查找,我们可以找到最小的最大分割子数组和,从而得到最终的答案。这种策略通过二分查找的方式逐步缩小可能的解空间,使得问题得以高效解决。

这里还使用了几个函数来实现,这里简单介绍一下(其实完全没必要只是最近刚学试试)

1.max_element

标准库 头文件中的一个函数模板,用于找到指定范围内的最大元素的迭代器,时间复杂度是 O(n)

用法

template< class ForwardIt >
ForwardIt max_element( ForwardIt first, ForwardIt last );

first:指向要查找范围的起始位置的迭代器。
last:指向要查找范围的末尾位置的迭代器(不包括末尾位置本身)。
max_element 返回指向范围中最大元素的迭代器。如果范围为空,它将返回 last

2.partial_sum

标准库 头文件中的一个函数模板,用于计算一个范围内元素的部分和,并将结果存储在另一个范围内,时间复杂度是 O(n)

用法

template< class InputIt, class OutputIt >
OutputIt partial_sum( InputIt first, InputIt last, OutputIt d_first );

first:指向要计算范围的起始位置的迭代器。
last:指向要计算范围的末尾位置的迭代器(不包括末尾位置本身)。
d_first:指向存储部分和结果的目标范围的起始位置的迭代器。
partial_sum 将范围 [first, last) 中的元素进行部分和运算,结果存储在以 d_first 为起始位置的目标范围中。

3.upper_bound

upper_bound 函数用于在已排序的区间中查找第一个大于给定值的元素的位置,时间复杂度是O(log n)
用法

template< class ForwardIt, class T >
ForwardIt upper_bound( ForwardIt first, ForwardIt last, const T& value );

first, last:定义查找范围的前开后闭区间,包括 first 但不包括 last
value:要比较的值。

4.distance

C++ 标准库中的函数,用于计算两个迭代器之间的距离(元素个数),时间复杂度取决于迭代器的类型,随机访问迭代器(如数组、vector 的迭代器),计算距离的操作是常数时间的,时间复杂度为 O(1)。
对于不支持随机访问的迭代器(如链表的迭代器),计算距离需要逐个遍历元素,时间复杂度为 O(N),其中 N 是两个迭代器之间的距离
用法

template <class InputIt>
typename iterator_traits<InputIt>::difference_type
distance(InputIt first, InputIt last);

first, last:定义计算距离的范围,包括 first 但不包括 last。
返回值:返回两个迭代器之间的距离(last - first),即元素个数。
注意:该函数适用于任何迭代器类型。

代码

class Solution {
public:int splitArray(vector<int>& nums, int k) {vector<int> pre_sum(nums.size() + 1, 0);partial_sum(nums.begin(), nums.end(), pre_sum.begin() + 1);int left = *max_element(nums.begin(), nums.end());int right = accumulate(nums.begin(), nums.end(), 0);while (left <= right) {int mid = (left + right) >> 1 ;int idx = 0;for (int i = 0; i < k; ++i) {auto it = upper_bound(pre_sum.begin(), pre_sum.end(), mid + pre_sum[idx]);idx = distance(pre_sum.begin(), it) - 1;if (idx == pre_sum.size() - 1) {break;}}if (idx == pre_sum.size() - 1) {right = mid - 1;} else {left = mid + 1;}}return left;}
};

运行结果

在这里插入图片描述

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

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

相关文章

玩转 SpEL 表达式

本文概览 欢迎阅读本文&#xff0c;其中我们将深入探讨 Spring Expression Language&#xff08;SpEL&#xff09;的语法和实际应用。从基础概念到高级用法&#xff0c;我们将在本文中了解如何使用 SpEL 提高代码的灵活性和表达力。无论大家是初学者还是有经验的开发者&#x…

ACM题解Day2|1.台风, 2.式神考试,3.DNA,4.方程求解

学习目标&#xff1a; 博主介绍: 27dCnc 专题 : 数据结构帮助小白快速入门 &#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d;&#x1f44d; ☆*: .&#xff61;. o(≧▽≦)…

Python 算法交易实验67 第一次迭代总结

说明 在这里对第一次迭代&#xff08;2023.7~ 2024.1&#xff09;进行一些回顾和总结&#xff1a; 回顾&#xff1a; 1 实现了0~1的变化2 在信息隔绝的条件下&#xff0c;无控制的操作&#xff0c;导致被套 总结&#xff1a; 思路可行&#xff0c;在春暖花开的时候&#x…

企业Oracle1 数据库管理

Oracle的安装 一、基础表的创建 1.1 切换到scott用户 用sys 账户 登录 解锁scott账户 alter user scott account unlock;conn scott/tiger;发现并不存在scott账户&#xff0c;自己创建一个&#xff1f; 查找资料后发现&#xff0c;scott用户的脚本需要自己执行一下 C:\ap…

三、MySQL库表操作

3.1 SQL语句基础&#xff08;SQL命令&#xff09; 3.1.1 SQL简介 SQL&#xff1a;结构化查询语言(Structured Query Language)&#xff0c;在关系型数据库上执行数据操作&#xff0c;数据检索以及数据维护的标准化语言。使用SQL语句&#xff0c;程序员和数据库管理员可以完成…

Opncv模板匹配 单模板匹配 多模板匹配

目录 问题引入 单模板匹配 ①模板匹配函数: ②查找最值和极值的坐标和值: 整体流程原理介绍 实例代码介绍: 多模板匹配 ①定义阈值 ②zip函数 整体流程原理介绍 实例代码: 问题引入 下面有请我们的陶大郎登场 这张图片是我们的陶大郎,我们接下来将利用陶大郎来介绍…

stm32h7中RTC的BCD模式与BIN模式

RTC的BCD格式与BIN格式 BCD&#xff08;Binary-Coded Decimal&#xff09;和BIN&#xff08;Binary&#xff09;是两种不同的数字表示格式。 BCD格式&#xff1a; BCD是一种用二进制编码表示十进制数字的格式。在BCD格式中&#xff0c;每个十进制数位使用4位二进制数来表示&am…

c++程序的内存模型,new操作符详解

目录 内存四区 程序运行前 代码区 全局区 程序运行后 栈区 堆区 new操作符 创建一个数 创建一个数组 内存四区 不同区域存放不同的数据&#xff0c;赋予不同的生命周期&#xff0c;让我们更加灵活的编程 程序运行前 程序运行前就有代码区和全局区 代码区 程序编…

Windows系统下使用docker-compose安装mysql8和mysql5.7

windows环境搭建专栏&#x1f517;点击跳转 win系统环境搭建&#xff08;十四&#xff09;——Windows系统下使用docker安装mysql8和mysql5.7 文章目录 win系统环境搭建&#xff08;十四&#xff09;——Windows系统下使用docker安装mysql8和mysql5.7MySQL81.新建文件夹2.创建…

《Linux C编程实战》笔记:信号处理函数的返回

信号处理函数可以正常返回&#xff0c;也可以调用其他函数返回到程序的主函数中&#xff0c;而不是从处理程序返回。 setjmp/longjmp 使用longjmp可以跳转到setjmp设置的位置 这两个函数原型如下 #include<setjmp.h> int setjmp(jmp_buf env); void longjmp(jmp_buf …

QQ数据包解密

Windows版qq数据包格式&#xff1a; android版qq数据包格式&#xff1a; 密钥&#xff1a;16个0 算法&#xff1a;tea_crypt算法 pc版qq 0825数据包解密源码&#xff1a; #include "qq.h" #include "qqcrypt.h" #include <WinSock2.h> #include…

构建库函数雏形(以GPIO为例)

构建库函数雏形 进行外设结构体定义构建置位和复位函数进行库函数的自定义 step I&#xff1a; \textbf{step I&#xff1a;} step I&#xff1a; 对端口进行输出数据类型枚举 step II&#xff1a; \textbf{step II&#xff1a;} step II&#xff1a;对端口进行结构化描述 step…

线性代数的学习和整理23:用EXCEL和python 计算向量/矩阵的:内积/点积,外积/叉积

目录 1 乘法 1.1 标量乘法(中小学乘法) 1.1.1 乘法的定义 1.1.2 乘法符合的规律 1.2 向量乘法 1.2.1 向量&#xff1a;有方向和大小的对象 1.2.2 向量的标量乘法 1.2.3 常见的向量乘法及结果 1.2.4 向量的其他乘法及结果 1.2.5 向量的模长&#xff08;长度&#xff0…

第三篇【传奇开心果系列】Vant开发移动应用:财务管理应用

传奇开心果博文系列 系列博文目录Vant开发移动应用系列博文 博文目录一、项目目标二、编程思路三、初步实现示例代码四、扩展思路五、使用Firebase等后端服务来实现用户认证和数据存储示例代码六、用Vant组件库实现收入和支出分类管理的示例代码七、用Vant组件库实现收入和支出…

Redis经典五大类型源码及底层实现

Redis经典五大类型源码及底层实现分析 1、一些题目 redis的zset底层实现&#xff1f;redis的跳表和压缩列表说一下&#xff0c;解决了哪些问题&#xff0c;时间复杂度和空间复杂度如何&#xff1f;redis的zset使用的是什么数据结构&#xff1f; Redis数据类型的底层数据结构…

《WebKit 技术内幕》之五(1): HTML解释器和DOM 模型

第五章 HTML 解释器和 DOM 模型 1.DOM 模型 1.1 DOM标准 DOM &#xff08;Document Object Model&#xff09;的全称是文档对象模型&#xff0c;它可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。这里的文档可以是 HTML 文档、XML 文档或者 XHTML 文档。D…

python基本数据类型 - 字典集合

引入 在内存中存储的数据可以是不同的数据类型。比如名字可以使用字符串存储&#xff0c;年龄可以使用数字存储&#xff0c;python有6种基本数据类型&#xff0c;用于各种数据的存储&#xff0c;分别是&#xff1a;numbers(数字类型)、string(字符串)、List(列表)、Tuple(元组…

【笔记】Blender4.0建模入门-3物体的基本操作

Blender入门 ——邵发 3.1 物体的移动 演示&#xff1a; 1、选中一个物体 2、选中移动工具 3、移动 - 沿坐标轴移动 - 在坐标平面内移动 - 自由移动&#xff08;不好控制&#xff09; 选中物体&#xff1a;右上的大纲窗口&#xff0c;点击物体名称&#xff0c;物体的轮…

文件操作(上)

目录 文件的必要性&#xff1a; 文件分类&#xff1a; 程序文件&#xff1a; 数据文件&#xff1a; 文件的打开与关闭&#xff1a; fopen函数分析: ​编辑 FILE*: char*filename: char*mode: fclose函数&#xff1a; 应用&#xff1a; 文件编译 Fgetc Fputc 应用…

HNU-数据挖掘-作业1

数据挖掘课程作业作业1 计科210X 甘晴void 202108010XXX 第一题 假设所分析的数据包括属性 age,它在数据元组中的值&#xff08;以递增序&#xff09;为13 ,15 ,16 ,16 ,19 ,20 ,20 ,21 ,22 ,22 ,25 ,25 ,25 ,25 ,30 ,33 ,33 ,35 ,35 ,35 ,35 ,36 ,40 ,45 ,46 ,52,70。 a.…