再总结下题目
1
lbfeng 2019-11-30 08:49:18 +08:00
要是分成 7 个数组方差为 0 不是更小吗
|
2
binux 2019-11-30 08:50:53 +08:00
[[1,2],[3,4,5],[6,7]] 为什么不行?
|
4
philobscur 2019-11-30 09:05:41 +08:00
|
5
redeemer1001 2019-11-30 09:07:12 +08:00
元素个数方差最小 那直接 a/b 向下取整作为数组元素个数的基数 然后 a/b 的余数个数组多一个元素 遍历一边插入新数组
10 行代码的事? |
6
redeemer1001 2019-11-30 09:07:47 +08:00
@redeemer1001 a/b 应该是 a.length/b
|
7
itstudying OP @redeemer1001 要求原数组数据顺序不变
|
8
itstudying OP @binux 可以,答案不唯一满足要求就行,关键是算法实现呢
|
9
itstudying OP @lbfeng 分成 n 份,n 是题目要求
|
10
itstudying OP @angsheng 题目也很清楚呀,元素个数方差最小
|
11
fluorinedog 2019-11-30 09:32:56 +08:00 via Android
这题题意不是很清晰...方差最小,是指让最大方差最小,还是方差的平均值 /总和最小?
不过两者都可以直接动态规划一波操作结束。即使允许调整顺序,也是多排个序的事。 |
12
fluorinedog 2019-11-30 09:34:42 +08:00 via Android
@fluorinedog 不好意思看错题了...
|
13
redeemer1001 2019-11-30 09:34:52 +08:00
@itstudying 按顺序遍历原数组插入新数组,顺序不变啊…
我给你段 js 代码 手机打的有错见谅 let baseL = a.length / b let plusOne = a.length % b let newArr = [] let i = 0 while(i < b){ newArrBase=[] for(let j = 0; j < baseL; j++) newArrBase.push(a[i++]) if(newArr.length < plusOne) newArrBase.push(a[i++]) newArr.push(newArrBase) } |
14
itstudying OP @redeemer1001 我也是手机,看了下代码比如 a 是[1,2,3,4,5,6,7,8] b 是 3,那么结果就是[[1,2],[3,4],[5,6,7,8]]那么各个元素个数就是 2,2,4,但其实应该是类似[[1,2,3],[4,5,6],[7,8]]这样元素个数是 3,3,2 的结果,因为 3-2 是小于 4-2 的。 或者正如#11 说的那样我题目意思理解错了?
|
15
redeemer1001 2019-11-30 10:00:22 +08:00
@itstudying 我的代码跑出来的结果应该是 3 3 2
但其实我觉得这题应该是 11 楼所说的那样……不然就太简单了 |
16
jeffh 2019-11-30 10:54:13 +08:00
楼主题目说清楚了吗?如果个数的方差,那么直接 a.length/b 是每组的基本元素个数,其中 a.length%b 组是 a.length/b+1 个元素。代码如下,跑出来的结果是:1 2 3 ,4 5 ,6 7 ,
```java /** * * 题目:数组 a 分成 b 份形成一个二维数组(每个数组间元素个数方差最小),并且保证原数组的顺序不变,如 * [1,2,3,4,5,6,7] 分成 3 份则为,[[1,2],[3,4],[,5,6,7]] 或者[[1,2,3],[4,5],[6,7]] 两个答案都可以,只满足条件就行 * * 思路:a.length / b 为基本元素个数,a.length % b 为多出来的个数,分配到 n 组内的某几组每组一个即可 */ public class V2EXTest { public static void main(String[] args) { int[] a = {1, 2, 3, 4, 5, 6, 7}; int b = 3; StringBuffer result = new StringBuffer(); int index = 0; // a.length % b 组每组为 a.length / b + 1 个元素 for (int i = 0; i < a.length % b; i++) { for (int j = 0; j < a.length / b + 1; j++) { result.append(a[index]); result.append(" "); index++; } result.append(","); } // 剩下的 b - a.length % b 组每组为 a.length/b 个元素 for (int i = 0; i < b - a.length % b; i++) { for (int j = 0; j < a.length / b; j++) { result.append(a[index]); result.append(" "); index++; } result.append(","); } // 打印结果 System.out.println(result.toString()); } } ``` |
17
JerryCha 2019-11-30 13:56:35 +08:00
不知道是不是指的是方差和。是的话就是 16 楼的代码了。
用于计算方差的平均数肯定是确定的( a/b )。 那么平均每组的个数是 floor(a/b)。 但是有 a%b 组个数需要加一。 |