题目描述:

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

注意:
数组长度 满足以下条件:

  • 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,在所有情况中最小。

错误思路:

最开始直接想到的方法是分组:   数1|数2|数3|数4 数5 数6 数7...........  分割线为分组情况, 然后记录下分割线的位置,从最右边的分割线开始,依次将分割线向右边移动,每次判断子数组和的最大值,如果减小就移动下一条分割线,于是很快写出了这样的代码。

JavaScript:

/*** @param {number[]} nums* @param {number} m* @return {number}*/
var splitArray = function(nums, m) {var splitArr=[];var valueArr=[];var len=nums.length;var max=0;for(var i=0;i<m;i++){splitArr.push(i);if(i!=m-1)valueArr.push(nums[i]);}var temp=0;for(var i=m-1;i<len;i++){temp+=nums[i];}splitArr.push(len-1);valueArr.push(temp);max=Math.max.apply(null,valueArr);for(var i=m-1;i>0;i--){var st=splitArr[i];var ed=splitArr[i+1];for(var j=st;j<ed;j++){var tempA=valueArr.concat();tempA[i]-=nums[j];tempA[i-1]+=nums[j];var tempMax=Math.max.apply(null,tempA);if(tempMax<max){max = tempMax;splitArr[i]=j+1;valueArr[i]-=nums[j];valueArr[i-1]+=nums[j];}else{break;}}}return max;
};

但是运行的时候不能通过全部的测试用例,分析了一下逻辑,发现陷入了局部最优解。

正确思路:

采用动态规划。用一个二维数组记录情况,记录分组里面子数组各自和的最大值最小的值。dp[i][j]表示将输入数组的前j个数分为i 组。其中有dp[0][0]=0。dp[i-1][k]表示将k个数分为i-1组,j-k个数单独分为一组。那么刚好合起来就是i组。 转变为找所有分组里面子数组和的最大值。在这些最大值里面找到最小的值。

JavaScript:

/*** @param {number[]} nums* @param {number} m* @return {number}*/
var splitArray = function(nums, m) {//动态规划var len=nums.length;var dp=[];var maxArr=[0];nums.forEach(function(item,index){maxArr[index+1]=maxArr[index]+item;});for(var i=0;i<=m;i++){dp[i]=[];for(var j=0;j<=len;j++){dp[i][j]=maxArr[maxArr.length-1];}}dp[0][0]=0;for(var i=1;i<=m;i++){for(var j=1;j<=len;j++){for(var k=i-1;k<j;k++){var value=Math.max(dp[i-1][k],maxArr[j]-maxArr[k]);dp[i][j]=Math.min(dp[i][j],value);}}}return dp[m][len];};

LeetCode 410. 分割数组的最大值相关推荐

  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. 分割数组的最大值(极小极大化 二分查找 / DP)

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

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

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

  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. 鼠标移动监听的注意事项
  2. Spark Streaming
  3. python中argv的用法
  4. 从国际站 - M 站建设谈开发者产品思维
  5. jq之toggle()
  6. 前端笔记-vue cli为web添加底纹
  7. 数据库MySQL基础---约束、表关系、聚合函数、连接查询、分组查询和子查询
  8. 简单应用定时器和监听器
  9. 九校联考-长沙市一中NOIP模拟总结
  10. AUC(Area under Curve Roc曲线下面积)计算方法总结
  11. 飞信linux下载文件,在Linux上安装飞信
  12. 十五、JDBC(高琪java300集+java从入门到精通笔记)
  13. 王者荣耀服务器未响应 小米,10月23日小米手机更新王者荣耀失败 小米更新不了新赛季怎么办...
  14. layui自定义新增tab页方法
  15. 2017AI最成功案例
  16. 【Unity】刮刮乐效果(擦除图片像素值)
  17. 计算机软件中级职称专业哪个容易考,计算机软考中级职称哪个最容易考
  18. python 关闭某个程序_python程序怎么结束
  19. 胜面试官半子,阿里SpringBoot全栈笔记首发,源码实战齐飞
  20. 2022-2028全球与中国标准磁簧开关市场现状及未来发展趋势

热门文章

  1. 数据结构与算法面试题80道(35)
  2. Firefox(火狐)下载时卡在最后1秒解决办法
  3. 条款4:确定对象在使用前已被初始化
  4. mysql A库a表 B库b表 将a表导入b表中
  5. DefaultIfEmpty
  6. 【Vegas原创】MagicAjax使用总结
  7. Docker Swarm 进阶:NFS 共享数据卷
  8. hadoop2.x伪集群搭建全流程
  9. hbase hfile java_通过生成HFile导入HBase
  10. QGIS for Android 开发:一、Ubuntu环境搭建