LeetCode 410. 分割数组的最大值
题目描述:
给定一个非负整数数组和一个整数 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,在所有情况中最小。
错误思路:
最开始直接想到的方法是分组: 数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. 分割数组的最大值相关推荐
- leetcode 410. 分割数组的最大值(二分法)
1. 题目描述 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小.注意: 数组长度 n 满足以下条件:1 ≤ n ≤ ...
- LeetCode 410——分割数组的最大值
1. 题目 2. 解答 此题目为 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道--最小分割分数. class Solution {public:// 若分割数组的最大值为 ...
- LeetCode 410. 分割数组的最大值(极小极大化 二分查找 / DP)
文章目录 1. 题目 2. 解题 2.1 二分查找 2.2 DP 1. 题目 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组. 设计一个算法使得这 m 个子数组各自和 ...
- Leetcode 410.分割数组的最大值(最优解是二分法)
Time: 20190904 Type: Hard, DP 题目描述 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最 ...
- 410. 分割数组的最大值
题解: 链接:https://leetcode-cn.com/problems/split-array-largest-sum/ 下面这种情况是dfs是超时的,有时间加一下记忆化 class Solu ...
- 四边形不等式技巧——分割数组的最大值(画家问题)
题目 给定一个整型数组arr,数组中的每个值都为正数,表示完成一幅画作需要的时间,再给定一个整数num,表示画匠的数量,每个画匠只能画连在一起的画作.所有的画家并行工作,请返回完成所有的画作需要的最少 ...
- 7、leetcode410 分割数组的最大值
leetcode410 分割数组的最大值 给定一个非负整数数组 nums 和一个整数 m ,你需要将这个数组分成 m 个非空的连续子数组. 设计一个算法使得这 m 个子数组各自和的最大值最小. 示例 ...
- LeetCode 659. 分割数组为连续子序列
LeetCode 659. 分割数组为连续子序列 回顾 根据题意,每个元素只会涉及两种情况: 已经存在nums[i]-1结尾的序列,我们把nums[i]接到之前的某个序列后. 尝试以nums[i]为头 ...
- 分割数组的最大值—leetcode410
给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小. 注意: 数组长度 n 满足以下条件: 1 ≤ n ≤ 1000 ...
最新文章
- 鼠标移动监听的注意事项
- Spark Streaming
- python中argv的用法
- 从国际站 - M 站建设谈开发者产品思维
- jq之toggle()
- 前端笔记-vue cli为web添加底纹
- 数据库MySQL基础---约束、表关系、聚合函数、连接查询、分组查询和子查询
- 简单应用定时器和监听器
- 九校联考-长沙市一中NOIP模拟总结
- AUC(Area under Curve Roc曲线下面积)计算方法总结
- 飞信linux下载文件,在Linux上安装飞信
- 十五、JDBC(高琪java300集+java从入门到精通笔记)
- 王者荣耀服务器未响应 小米,10月23日小米手机更新王者荣耀失败 小米更新不了新赛季怎么办...
- layui自定义新增tab页方法
- 2017AI最成功案例
- 【Unity】刮刮乐效果(擦除图片像素值)
- 计算机软件中级职称专业哪个容易考,计算机软考中级职称哪个最容易考
- python 关闭某个程序_python程序怎么结束
- 胜面试官半子,阿里SpringBoot全栈笔记首发,源码实战齐飞
- 2022-2028全球与中国标准磁簧开关市场现状及未来发展趋势