Split Array Largest Sum
来源:互联网 发布:我的世界强制附魔js 编辑:程序博客网 时间:2024/04/30 17:19
Split Array Largest Sum
Given an array which consists of non-negative integers and an integer m, you can split the array intom non-empty continuous subarrays. Write an algorithm to minimize the largest sum among thesem subarrays.
Note:
If n is the length of array, assume the following constraints are satisfied:
- 1 ≤ n ≤ 1000
- 1 ≤ m ≤ min(50, n)
Examples:
Input:nums = [7,2,5,10,8]m = 2Output:18Explanation:There are four ways to split nums into two subarrays.The best way is to split it into [7,2,5] and [10,8],where the largest sum among the two subarrays is only 18.解析:
自己吭哧了半天,找到所有分成m份的结果求出所有的最小值,开始超时,对遍历前面的和大于后面的最大值时进行剪枝,a了,后来看大神的解答,大家都用二分法,特别巧妙,我怎么就想不出了呢,m=1时,结果就是所有值的和,m=n时,结果就是最大值,m为其他的值结果就在两个值之间,对这个值进行二分查找。
代码:
class Solution {public: int splitArray(vector<int>& nums, int m) { vector<vector<int>>vis(m+1,vector<int>(nums.size(),0)); return dfs(nums,m,0,vis); } int dfs (vector<int>&nums,int m,int begin,vector<vector<int>> &vis) { if (vis[m][begin]) return vis[m][begin]; int ans=0; if (m==1) { for (int i=begin; i<nums.size(); i++) { ans+=nums[i]; } vis[m][begin]=ans; return ans; } if ((nums.size()-begin)==m) { vis[m][begin]=*max_element(nums.begin()+begin,nums.end()); return vis[m][begin]; } ans=INT_MAX; int i; int tempsum=0; int temp=0; for ( i=begin+1; i<nums.size()-m+2; i++) { tempsum=0; for (int j=begin; j<i; j++) { tempsum+=nums[j]; } if (vis[m-1][i]) { temp=vis[m-1][i]; } else { temp=dfs(nums,m-1,i,vis); vis[m-1][i]=temp; } ans=min(ans,max(tempsum,temp)); if (tempsum>temp) break; } return ans; } };
class Solution {public: int splitArray(vector<int>& nums, int m) { long long left=0; long long right=0; for (int i=0; i<nums.size(); i++) { right+=nums[i]; left=max(left,(long long)nums[i]); } while(left<right) { int mid=(left+right)/2; if (split(nums,m,mid)) right=mid; else left=mid+1; } return left; } bool split(vector<int>&nums,int cut,int mid) { int count=1; long long sum=0; for (int i=0; i<nums.size(); i++) { sum+=nums[i]; if (sum>mid) { count++; if (count>cut) return false; sum=nums[i]; } } return true; }}
0 0
- Split Array Largest Sum
- Split Array Largest Sum
- Split Array Largest Sum
- LeetCode: Split Array Largest Sum
- 410. Split Array Largest Sum
- 410. Split Array Largest Sum
- 410. Split Array Largest Sum
- [Leetcode] Split Array Largest Sum
- 410. Split Array Largest Sum
- 410. Split Array Largest Sum
- 410. Split Array Largest Sum
- 410. Split Array Largest Sum
- 410. Split Array Largest Sum
- 【Leetcode】410. Split Array Largest Sum
- leetcode 410 Split Array Largest Sum
- leetcode 410.Split Array Largest Sum
- LeetCode No.410 Split Array Largest Sum
- leetcode-410. Split Array Largest Sum
- IntelliJ IDEA 配置tomcat
- Spring中的自定义类型转换器
- 周志华《机器学习》第 3 章 线性模型
- Oracle密码输错账户被锁的解决方法
- Spring MVC工作流程图
- Split Array Largest Sum
- Python注释
- singTask和FLAG_ACTIVITY_CLEAR_TOP的区别
- matlab剪裁图像
- 通过反编译深入理解Java String及intern
- 关于中文编码的一些问题
- [Java]java.sql.Timestamp(时间戳)
- weblogic基础知识_简单整理
- 1068. 万绿丛中一点红