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. 思路

核心,二分查找各个子数组和的最大值的最小情况1. 子数组的最大值是有范围的,即在区间[max(nums),sum(nums)]之中。2. 令l=max(nums),h=sum(nums),mid=(l+h)/2,计算数组和最大值不大于mid对应的子数组个数cnt(这个是关键!)3. 如果cnt>m,说明划分的子数组多了,即我们找到的mid偏小,故l=mid+1;4. 如果cnt<=m,说明划分的子数组少了,即mid偏大(或者正好就是目标值),故h=mid。

3. 代码

class Solution {public int splitArray(int[] nums, int m) {/**子数组的最大值是有范围的,即在区间[max(nums),sum(nums)]之中。*/long l = nums[0];long h = 0;for (int i : nums) {h += i;//max(nums)l = l > i ? l : i;//sum(nums)
        }/**计算数组和最大值不大于mid对应的子数组个数cnt*/while (l<h) {//二分法找分割数组的最大值long mid = (l + h) / 2;long temp = 0;int cnt = 1;//初始值为1,for(int i:nums) {temp += i;if(temp>mid) {//如果超过mid,开启新的一组temp = i;//每个子数组和++cnt;//子数组个数
                }}if(cnt>m)l = mid + 1;//如果cnt>m,说明划分的子数组多了,即我们找到的mid偏小,故l=mid+1;elseh = mid;//如果cnt<=m,说明划分的子数组少了,即mid偏大(或者正好就是目标值),故h=mid。
        }return (int)l;}
}

转载于:https://www.cnblogs.com/haimishasha/p/11565495.html

leetcode 410. 分割数组的最大值(二分法)相关推荐

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

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

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

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

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

    文章目录 1. 题目 2. 解题 2.1 二分查找 2.2 DP 1. 题目 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组. 设计一个算法使得这 m 个子数组各自和 ...

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

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

  5. 410. 分割数组的最大值

    题解: 链接:https://leetcode-cn.com/problems/split-array-largest-sum/ 下面这种情况是dfs是超时的,有时间加一下记忆化 class Solu ...

  6. 四边形不等式技巧——分割数组的最大值(画家问题)

    题目 给定一个整型数组arr,数组中的每个值都为正数,表示完成一幅画作需要的时间,再给定一个整数num,表示画匠的数量,每个画匠只能画连在一起的画作.所有的画家并行工作,请返回完成所有的画作需要的最少 ...

  7. 7、leetcode410 分割数组的最大值

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

  8. LeetCode 659. 分割数组为连续子序列

    LeetCode 659. 分割数组为连续子序列 回顾 根据题意,每个元素只会涉及两种情况: 已经存在nums[i]-1结尾的序列,我们把nums[i]接到之前的某个序列后. 尝试以nums[i]为头 ...

  9. 分割数组的最大值—leetcode410

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

最新文章

  1. MPB:军科院杨瑞馥、毕玉晶等-​​培养组学方法优化(视频)
  2. 第49周星期二PD数据库逆向工程
  3. 关于return和exit
  4. 测试缺陷分析务实篇-转
  5. Python 爬虫篇 - 通过urllib.request伪装成浏览器绕过反爬虫爬取网页所有连接实例演示,urllib2库的安装
  6. 多线程存数据mysql_java 多线程存储数据库
  7. 【拔刀吧少年】之awk文本和数据处理编程语言
  8. jquery easyui datagrid js获取记录数 页数 当前页
  9. JavaScript知识点之:delete操作符
  10. codeforces 816 E. Karen and Supermarket(树形dp)
  11. 练习题︱streamlit + opencv/YOLOv3 快速构建自己的图像目标检测demo网页
  12. firewalls 查看防火墙状态_5条命令玩转Linux系统防火墙
  13. 51单片机呼吸灯c语言程序,用51单片机的呼吸灯程序
  14. 利用计算机本地文档重装系统,本地模式怎么进入PE系统对电脑进行重装
  15. libcef(一)编译CEF
  16. vnc远程连接,5步实现vnc远程连接
  17. 用python的matplotlib和numpy库绘制股票K线均线
  18. 关于word-break和word-wrap的使用和区别
  19. 看电子巨头的那些分分合合
  20. 通用人工智能最新突破!一个Transformer搞定一切

热门文章

  1. OpenShift 4 - 设置集群节点和Pod容器的时间和时区
  2. 使用ViewModel模式简化WPF TreeView
  3. .NET Core Web API:您需要了解的最少知识(第1部分,共2部分)
  4. SQL 2017——新功能
  5. 快速打开计算机磁盘的软件,怎样快速启动电脑
  6. springboot+vue+element+mybatisplus项目(前端)
  7. cvpr 注意力机制_视频人员重识别:关系引导空间注意力 + 时间特征提取模型
  8. wxpython下载很慢_FAQ:在 Windows 使用 Python
  9. c语言实验转换字母顺序结构,实验1顺序结构的程序设计-实验报告.doc
  10. 华为荣耀7能改成Linux吗,华为荣耀7电池怎么样?华为荣耀7可以更换电池吗?