split-array-largest-sum(参考了discuss)
注意,第一种用法,涉及到一些Java的知识。就是采用Object作为HashMap的key的时候,需要重载这个Class的 equals 和 hashCode 这两个方法。其中equals需要判断一下比较元素的类型,而hashCode 里面可以采用 String.valueOf(val).hashCode() ^ 的方法来处理。
在HashMap里面查找的时候,会调用HashMap里面的元素的equals方法,把待查找的元素作为参数传给这个方法,来进行比较和判断元素是否存在于HashMap中。
- // 参考 https://discuss.leetcode.com/topic/61315/java-easy-binary-search-solution-8ms
- // 开始用类似回溯的方法做,ETL了
- public class Solution {
- public int splitArray(int[] nums, int m) {
- int mlen = nums.length - m;
- int minM = 0;
- int maxM = 0;
- int sum = 0;
- for (int k=0; k<nums.length; k++) {
- sum += nums[k];
- if (k > mlen) {
- sum -= nums[k-1-mlen];
- }
- maxM = Math.max(maxM, sum);
- minM = Math.max(minM, nums[k]);
- }
- System.out.printf("min:%d, max %d\n", minM, maxM);
- int result = bsearch(nums, m, minM, maxM);
- return result;
- }
- private int bsearch(int[] nums, int m, int low, int high) {
- int mid = 0;
- while (low < high) {
- mid = low + (high-low) / 2;
- if (isValid(nums, m, mid)) {
- high = mid;
- } else {
- low = mid + 1;
- }
- }
- return high;
- }
- private boolean isValid(int[] nums, int m, int cand) {
- int split = 1;
- int sum = 0;
- for (int i=0; i<nums.length; i++) {
- sum += nums[i];
- if (sum > cand) {
- split++;
- if (split > m) {
- return false;
- }
- sum = nums[i];
- }
- }
- return true;
- }
- /*
- class KPair {
- public int pos;
- public int m;
- @Override
- public int hashCode() {
- int ret = String.valueOf(pos).hashCode() ^ String.valueOf(m).hashCode();
- return ret;
- }
- @Override
- public boolean equals(Object obj) {
- if (null == obj) {
- return false;
- }
- if (!(obj instanceof KPair)) {
- return false;
- }
- KPair kp = (KPair)obj;
- //System.out.printf("kp%d p%d km%d m%d\n", kp.pos, pos, kp.m, m);
- return kp.pos == pos && kp.m == m;
- }
- }
- public int splitArray(int[] nums, int m) {
- Map mp = new HashMap();
- KPair okp = new KPair();
- int tmp = 0;
- int newval = 0;
- KPair kp = new KPair();
- kp.pos = 0;
- kp.m = 1;
- //System.out.printf("in1 p%d m%d\n", kp.pos, kp.m);
- mp.put(kp, nums[0]);
- for (int i=1; i<nums.length; i++) {
- okp.pos = i-1;
- okp.m = 1;
- tmp = (int)(mp.get(okp))+nums[i];
- KPair kp2 = new KPair();
- kp2.pos = i;
- kp2.m = 1;
- //System.out.printf("in2 p%d m%d\n", kp2.pos, kp2.m);
- mp.put(kp2, tmp);
- for (int k=0; k<i; k++) {
- // tmp is sum of k+1 to i
- tmp -= nums[k];
- okp.pos = k;
- for (int j=2; j<=m && j<=k+2; j++) {
- okp.m = j-1;
- //System.out.printf("for2 p%d m%d\n", okp.pos, okp.m);
- newval = (int)(mp.get(okp));
- if (tmp > newval) {
- newval = tmp;
- }
- KPair kp3 = new KPair();
- kp3.pos = i;
- kp3.m = j;
- if (mp.get(kp3) == null || (int)(mp.get(kp3)) > newval) {
- //System.out.printf("in3 p%d m%d\n", kp3.pos, kp3.m);
- mp.put(kp3, newval);
- }
- }
- }
- }
- KPair kpr = new KPair();
- kpr.pos = nums.length-1;
- kpr.m = m;
- return (int)(mp.get(kpr));
- }
- */
- }
split-array-largest-sum(参考了discuss)的更多相关文章
- [LeetCode] Split Array Largest Sum 分割数组的最大值
Given an array which consists of non-negative integers and an integer m, you can split the array int ...
- [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 ...
- 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 ...
- Split Array Largest Sum LT410
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
做了Zenefits的OA,比面经里的简单多了..害我担心好久 阴险的Baidu啊,完全没想到用二分,一开始感觉要用DP,类似于极小极大值的做法. 然后看了答案也写了他妈好久. 思路是再不看M的情况下 ...
随机推荐
- jquery validate表单验证插件的基本使用方法及功能拓展
1 表单验证的准备工作 在开启长篇大论之前,首先将表单验证的效果展示给大家. 1.点击表单项,显示帮助提示 2.鼠标离开表单项时,开始校验元素 3.鼠标离开后的正确.错误提示及鼠标移入时的帮助提 ...
- 二叉排序树实现(C++封装)
设计思路 设计一个类,根结点只可读取,具备构造二叉树.插入结点.删除结点.查找. 查找最大值.查找最小值.查找指定结点的前驱和后继等功能接口. 二叉排序树概念 它或者是一棵空树:或者是具有下列性质的二 ...
- Java8所有的包介绍(由英文文档翻译而来)
转载: Java8所有的包介绍(由英文文档翻译而来)
- windows环境下模仿Linux环境发起curl请求
1.到官网下载curl工具包 2.在curl.exe目录中使用(使用方式1) 解压下载后的压缩文件,通过cmd命令进入到curl.exe所在的目录. 由于博主使用的是windows 64位 的系统,因 ...
- ZOJ 3957 Knuth-Morris-Pratt Algorithm
暴力. #include<bits/stdc++.h> using namespace std; ]; int main() { int T; scanf("%d",& ...
- Mybatis源码分析之参数处理
Mybatis对参数的处理是值得推敲的,不然在使用的过程中对发生的一系列错误直接懵逼了. 以前遇到参数绑定相关的错误我就是直接给加@param注解,也稀里糊涂地解决了,但是后来遇到了一些问题推翻了我的 ...
- JavaSE1
<The Pragmatic Programmer><The Mythical Man-month><Clean Code><The Clean Coder& ...
- Python操作Mongo数据库
连接数据库 import pymongo # 连接到数据库,以下两种方式均可 client = pymongo.MongoClient(host='localhost', port=27017) cl ...
- 【WIN10】Bind、Binding與Converter的使用
Demo源碼下載:http://yunpan.cn/cHuCmI4NK4xwr 访问密码 8201 1.Bind Bind的使用方式是: <Button Content="{x:Bi ...
- HihoCoder - 1756 打怪
题面在这里! 拆成两个部分分别算显然比较简单. 前面一个部分排个序枚举最大值算就好啦. 后面的就相当于把每一种数值的贡献加起来,也可以在排完序之后的a[]上面直接算出来. #include<bi ...