文章目录

  • 1. 题目
  • 2. 解题
    • 2.1 二分查找
    • 2.2 DP

1. 题目

给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。
设计一个算法使得这 m 个子数组各自和最大值最小

注意:
数组长度 n 满足以下条件:
1 ≤ n ≤ 1000
1 ≤ m ≤ min(50, n)示例:
输入:
nums = [7,2,5,10,8]
m = 2输出:
18
解释:
一共有四种方法将nums分割为2个子数组。
其中最好的方式是将其分为[7,2,5] 和 [10,8],
因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/split-array-largest-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 二分查找

类似题目:
LeetCode 875. 爱吃香蕉的珂珂(二分查找)
LeetCode LCP 12. 小张刷题计划(二分查找)
LeetCode 1011. 在 D 天内送达包裹的能力(二分查找)
LeetCode 1062. 最长重复子串(二分查找)
LeetCode 5438. 制作 m 束花所需的最少天数(二分查找)
LeetCode 1102. 得分最高的路径(优先队列BFS/极大极小化 二分查找)
LeetCode 1231. 分享巧克力(极小极大化 二分查找)

class Solution {public:int splitArray(vector<int>& nums, int m) {long long l = 0, r = 1e15, maxsum, ans;while(l <= r){maxsum = l+((r-l)>>1);if(canSplitM(nums, maxsum, m))r = maxsum-1, ans = maxsum;elsel = maxsum+1;}return ans;}bool canSplitM(vector<int>& nums, long long maxsum, int m) {int count = 0;long long sum = 0;for(int i = 0; i < nums.size(); ++i){if(sum+nums[i] <= maxsum)//和的最大值没有超过设定的maxsumsum += nums[i];else//超过了{count++;sum = 0;i--;}if(count >= m)return false;}return true;}
};

0 ms 7 MB

2.2 DP

  • dp[i][j] 表示前 i 个数,分成 j 组的最小的最大和的值
  • 先预处理求出前缀和 sum
  • dp[i][j]=min(dp[i][j],max(dp[k][j−1],sum[i]−sum[k])),k∈[0,i]dp[i][j] = min(dp[i][j], max(dp[k][j-1], sum[i]-sum[k])), k \in[0,i]dp[i][j]=min(dp[i][j],max(dp[k][j−1],sum[i]−sum[k])),k∈[0,i]
class Solution {public:int splitArray(vector<int>& nums, int m) {int n = nums.size(), i, j, k;vector<long long> sum(n+1, 0);for(i = 1; i <= n; ++i)sum[i] = sum[i-1] + nums[i-1];vector<vector<long long>> dp(n+1, vector<long long>(m+1,1e15));dp[0][0] = 0;for(i = 1; i <= n; ++i)for(j = 1; j <= min(i,m); ++j)for(k = 0; k <= i; ++k)dp[i][j] = min(dp[i][j], max(dp[k][j-1], sum[i]-sum[k]));return dp[n][m];}
};

412 ms 8.2 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 410. 分割数组的最大值(极小极大化 二分查找 / DP)相关推荐

  1. leetcode 410. 分割数组的最大值(二分法)

    1. 题目描述 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小.注意: 数组长度 n 满足以下条件:1 ≤ n ≤ ...

  2. LeetCode 410——分割数组的最大值

    1. 题目 2. 解答 此题目为 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道--最小分割分数. class Solution {public:// 若分割数组的最大值为 ...

  3. LeetCode 410. 分割数组的最大值

    题目描述: 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小. 注意: 数组长度 n 满足以下条件: 1 ≤ n ≤ ...

  4. Leetcode 410.分割数组的最大值(最优解是二分法)

    Time: 20190904 Type: Hard, DP 题目描述 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最 ...

  5. leetcode 分享巧克力 java_LeetCode 1231. 分享巧克力(极小极大化 二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 你有一大块巧克力,它由一些甜度不完全相同的小块组成.我们用数组 sweetness 来表示每一小块的甜度. 你打算和 K 名朋友一起分享这块巧克力,所以你 ...

  6. LeetCode 1231. 分享巧克力(极小极大化 二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 你有一大块巧克力,它由一些甜度不完全相同的小块组成.我们用数组 sweetness 来表示每一小块的甜度. 你打算和 K 名朋友一起分享这块巧克力,所以你 ...

  7. LeetCode 774. 最小化去加油站的最大距离(极小极大化 二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 假设我们在一条水平数轴上,列表 stations 来表示各个加油站的位置,加油站分别在 stations[0], stations[1], ..., st ...

  8. [Golang]力扣Leetcode - 852. 山脉数组的峰顶索引(二分查找)

    [Golang]力扣Leetcode - 852. 山脉数组的峰顶索引(二分查找) 题目:符合下列属性的数组 arr 称为 山脉数组 : arr.length >= 3 存在 i(0 < ...

  9. LeetCode 1552. 两球之间的磁力(极小极大化 二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 在代号为 C-137 的地球上,Rick 发现如果他将两个球放在他新发明的篮子里,它们之间会形成特殊形式的磁力. Rick 有 n 个空的篮子,第 i 个 ...

最新文章

  1. python编写一个软件-使用python制作一个解压缩软件
  2. MySQL--安装及配置
  3. math.sqrt 有问题_JavaScript中带有示例的Math.sqrt()方法
  4. MaxCompute Studio使用心得系列6——一个工具完成整个Python UDF开发
  5. Python 多线程爬取西刺代理
  6. 入微:探究文档中找不到的12c并行索引扫描新特性
  7. 如何构建可视化的营销数据大屏? 1
  8. Beta Daily Scrum 第五天
  9. php如何安装源码包,php源码包安装步骤是什么
  10. 用四级法测量计算机土壤电阻率,土壤电阻率的原理及测量土壤电阻率的测量方法...
  11. dump的文件 查看pg_详解linux查看磁盘读写信息--blockdump、blktrace、systemtap
  12. Java之美[从菜鸟到高手演变]之设计模式四
  13. 挑战程序设计竞赛(第2版)1.6.1题
  14. Moodle安装完全手册
  15. 施一公:如何提高专业英文文献阅读能力?
  16. 光纤收发器tx和rx的区别?
  17. 高中生如何结合生物思维导图做好知识点整理?
  18. 网站中CSS是实现什么功能的,什么是CSS,其主要作用是什么
  19. Sql Server中进行查询操作时提示“对象名无效”
  20. 请求后台时对uri进行编码——即encodeURIComponent()的使用

热门文章

  1. python安装opencv出现错误_Python3安装OpenCV出错,如何解决?
  2. 三星+android+7.0+自动纠正单词,升级党必看!三星S/Note系列更新Android 7.0指南
  3. 应用层为何不能设置分辨率
  4. Linux设备驱动模型2——总线式设备驱动组织方式
  5. 数据结构探险——栈篇
  6. 新高考不选物理可以学计算机吗,新高考选科中物理真的那么重要吗?没有选物理是不是完了?...
  7. git 使用及常用命令介绍
  8. jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理
  9. struts2学习笔记之十一:struts2的类型转换器
  10. 【miscellaneous】北斗短报文