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的情况下 ...
随机推荐
- spring boot 使用不同的profile来加载不同的配置文件
在开发过程之中,经常需要在开发和测试环境中进行互相切换,当切换的同时需要加载相应的配置文件,因此要经常 性的对配置文件进行相应的修改,长此以往感到十分痛苦.如果能针对开发和测试环境分别建两个不同的配置 ...
- crontab定时运行python脚本访问MySQL遇到问题
最近写了一个python脚本来定时备份MySQL数据库.具体实现如下: 1)python脚本中使用os.system("mysqldump -h127.0.0.1 -uroot -ppass ...
- C#多线程编程实战(一):线程基础
1.1 简介 为了防止一个应用程序控制CPU而导致其他应用程序和操作系统本身永远被挂起这一可能情况,操作系统不得不使用某种方式将物理计算分割为一些虚拟的进程,并给予每个执行程序一定量的计算能力.此外操 ...
- lambda 表达式+python内置函数
#函数 def f1(a,b): retrun a+b #lambda方式,形参(a,b):返回值(a+b) f2=lambda a,b : a+b 在一些比较简单的过程计算就可以用lambda p ...
- 腾讯后台研发暑期实习offer经历
昨晚看到腾讯校招的微信状态,一颗心终于落下来了,终于可以去梦寐以求的鹅厂工作了.想想这一个多月以来,心情就像过山车一样,此起彼伏,一会充满希望,一会又跌入谷底. 三月份的时候,听说腾讯可以内推了,我内 ...
- 最大流KK算法
最大流KK算法 #include<iostream> #include<stdio.h> #include<string.h> #include<math.h ...
- 「LOJ6482」LJJ爱数数
「LOJ6482」LJJ爱数数 解题思路 : 打表发现两个数 \(a, b\) 合法的充要条件是(我不管,我就是打表过的): \[ a + b = \text{gcd}(a, b)^2 \] 设 \( ...
- 【bzoj1875】【JZYZOJ1354】[SDOI2009]HH去散步 矩阵快速幂 点边转换
http://172.20.6.3/Problem_Show.asp?id=1354 http://www.lydsy.com/JudgeOnline/problem.php?id=1875 题意: ...
- Yolov_3 网络结构分析
转自:https://blog.csdn.net/KKKSQJ/article/details/83587138 original Based on keras-yolov3, understandi ...
- bzoj 2770 堆的中序遍历性质
我们知道二叉搜索树的中序遍历是一个已经排好序的序列,知道序列我们无法确定树的形态(因为有多种). 但是,Treap如果告诉我们它的关键字以及权值,那么就可以唯一确定树的形态(Treap的O(logn) ...