410. Split Array Largest Sum
做了Zenefits的OA,比面经里的简单多了。。害我担心好久
阴险的Baidu啊,完全没想到用二分,一开始感觉要用DP,类似于极小极大值的做法。
然后看了答案也写了他妈好久。
思路是再不看M的情况下,最终结果的取值范围是[最大的元素,所有元素之和],然后就是用二分在这个范围里找。
注意二分的取舍要配合取舍方程,我用的方程是,保证子集的和都小于等于二分测试的那个二分M,然后集合数小于要求的m。一旦子集数量超过m,说明我们测试的二分M太小了,弄大点,才能让每个子集多放点元素,从而使得总子集数不超过m.
所以返还失败的情况下 L = M + 1
返还成功并不代表就是解,它仅仅表示当前二分M可以使得分出的子集数不超过m,所以R=M作为候选,这样最后判断失败保留的R就是最后一次成功的判断。
反正我这里写了好久,一开始套用yes right, no left的二分判断,判断之后还要重新遍历一次,看看最后的值是否是正确的解,是的话返还R,不是的话返还R+1.
最后,数组里还混杂了Integer.MAX_VALUE,所以计算的时候得改成LONG才行。
主要是卡二分,80%的时间卡在二分上。。越做题越发现自己不会二分了。
ref: leetcode discuss board
(https://discuss.leetcode.com/topic/61315/java-easy-binary-search-solution-8ms)
public class Solution
{
public int splitArray(int[] nums, int m)
{
long max = 0; // largest sum
long maxVal = -1; // smallest sum
//Arrays.sort(nums);
for(int i = 0; i < nums.length;i++)
{
max += nums[i];
maxVal = Math.max(maxVal,nums[i]);
}
if(m == 1) return (int)max;
long res = search(nums,m,max,maxVal);
return (int)res;
}
public long search(int[] nums, int m, long max, long maxVal)
{
long L = maxVal;
long R = max;
while(L < R)
{
long M = L + (R - L)/2;
if(isOK(M,nums,m))
{
R = M;
}
else
{
L = M + 1;
}
}
return R;
}
public boolean isOK(long M, int[] nums, int m)
{
int num = 1;
long cur = 0;
for(int i = 0; i < nums.length;i++)
{
if(cur + nums[i] <= M)
{
cur += nums[i];
}
else
{
num++;
cur = nums[i];
if(num > m) return false;
}
}
return true;
}
/*
[1,2,3,4,5]
2
[1,2,3,4,5,5,6,7,8,9,10,13,15,16,17,18,23,25,46,58]
3
[1,2147483646]
1
*/
}
求Zenefits给个机会吧。。给你跪舔了。
410. Split Array Largest Sum的更多相关文章
- [LeetCode] 410. Split Array Largest Sum 分割数组的最大值
Given an array which consists of non-negative integers and an integer m, you can split the array int ...
- 410. Split Array Largest Sum 把数组划分为m组,怎样使最大和最小
[抄题]: Given an array which consists of non-negative integers and an integer m, you can split the arr ...
- 【leetcode】410. Split Array Largest Sum
题目如下: Given an array which consists of non-negative integers and an integer m, you can split the arr ...
- 410 Split Array Largest Sum 分割数组的最大值
给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小.注意:数组长度 n 满足以下条件: 1 ≤ n ≤ 1000 ...
- [LeetCode] Split Array Largest Sum 分割数组的最大值
Given an array which consists of non-negative integers and an integer m, you can split the array int ...
- Split Array Largest Sum
Given an array which consists of non-negative integers and an integer m, you can split the array int ...
- Leetcode: Split Array Largest Sum
Given an array which consists of non-negative integers and an integer m, you can split the array int ...
- [Swift]LeetCode410. 分割数组的最大值 | Split Array Largest Sum
Given an array which consists of non-negative integers and an integer m, you can split the array int ...
- 动态规划——Split Array Largest Sum
题意大概就是,给定一个包含非负整数的序列nums以及一个整数m,要求把序列nums分成m份,并且要让这m个子序列各自的和的最大值最小(minimize the largest sum among th ...
随机推荐
- clientX/Y,pageX/Y,offsetX/Y,layerX/Y,screenX/Y ,offsetTop,offsetLeft 详解
clientX/Y: clientX/Y获取到的是触发点相对浏览器可视区域左上角距离,不随页面滚动而改变 兼容性:所有浏览器均支持 pageX/Y: pageX/Y获取到的是触发点相对文档区域左上角距 ...
- jQuery插件综合应用(二)文字为主的页面
一.介绍 文字内容是每个网站都有的内容,网站在展示文字内容时,总是比图片.视频等富媒体内容要难一些,因为富媒体容易被用户接受.尤其是越多的文字内容越难以被用户通篇的阅读,跳跃式阅读往往是阅读的主要方式 ...
- 学 Android 是一种什么样的体验?
转眼间 2016 年的电量已不足 20%,不禁感慨 How Time Flies!不知不觉 Android 移动开发已经走过了八年的光阴,在这八年的时间中,Android 开发从最初的简单调用系统 A ...
- max os 安装python模块PIL
下载libjpeg和zlib: http://www.ijg.org/files/jpegsrc.v9.tar.gz http://zlib.net/zlib-1.2.8.tar.gz 安装libjp ...
- [python] 视频008
悬挂else if(hi>2) if(hi>7) printf('aaa') else printf('b') c语言中else会与就近if匹配 三元操作符 small=x if x< ...
- MAC Python环境配置以及安装Pycharm 5.4.0
安装XCODE 去APP STORE下载,然后安装.免费 终端执行 xcode-select --install 安装或更新命令行开发工具 安装Pycharm 下载软件 官网:https://www. ...
- MVC5框架解析之MvcHandler
从MvcHandler开始 首选MvcHandler显示实现了IHttpHandler接口中的void ProcessRequest(HttpContext context); 外层逻辑: 1.方法参 ...
- Zoj 3865 Superbot
按规则移动机器人 , 问是否能拾得宝藏 . 加了一个控制板 , 还增加了一个控制板移动周期 p 将移动周期变换一下 , 移动一次 就相当于光标向左不耗费时间的移动了一格 搜索思路 : 搜索当前格子到 ...
- 一些有用的 Emacs 配置(窗口快速切换、一键透明效果、任意位置删除整行等)
本篇文章记录的是一些有用的 Emacs 配置,有些是自己原创,有些是借鉴别人(能记起来出处的我放了链接). 规定:C 代表 Ctrl,M 代表 Alt. 1.设置一次跳跃 n 行的快捷键 按 C-M- ...
- 【转载】HRTF音频3D定位技术综述
1. 序 您一定有过这样的经验:在一个炎热的夏夜,讨厌的蚊子在你的耳边飞舞.此时,没有比除掉这个祸害更急所的了,对吧?做到这一点,不必睁大了眼去找蚊子,只需依靠敏锐的听力,一样可以确定蚊子的方位,在漆 ...