在此挑战中,您需要对列表进行分区,其中分区具有最大大小,最小大小和首选大小。我将使用该符号(min,pref,max)
来表示此挑战中的大小。
对于不熟悉分区的人,以下列表已分为三部分:
[0..9] -> [[0,1,2],[3,4,5],[6,7,8]]
当列表不能被均等分割时,您需要使分区尽可能地接近首选大小:[0..10], (2,4,5) -> [[0,1,2,3],[4,5,6],[7,8,9]]
。[[0,1,2,3],[4,5,6,7],[8,9]]
即使该分区具有更多的首选长度,该分区也比首选。正式地,我们需要最小化(partitionLength-preferredSize)^2
每个分区的总和。
分区长度的顺序无关紧要:对于[0..5], (2,3,3)
,[[0,1,2],[3,4]]
或者[[0,1],[2,3,4]]
有效。如果没有分区,则返回一个空数组:[0..7], (4,4,5) -> []
。
您可以假定1<=min<=pref<=max
,并且传递给您的数组是一个非空的整数数组。数组将始终是第一个参数。您可以以任何顺序,以元组或单独的参数接受min,max和pref。
您的程序必须在几秒钟内运行。基本上,不允许在边界内遍历所有可能的分区大小。
测试用例:
[1], (1,3,4) -> [[1]]
[100], (1,2,3) -> [[100]]
[1,2], (1,1,2) -> [[1],[2]]
[1,2], (1,2,2) -> [[1,2]]
[1,2], (1,3,3) -> [[1,2]]
[1,2,3], (1,2,3) -> [[1,2],[3]] or [[1,2,3]]
[1,2,3,4], (1,3,4) -> [[1,2,3,4]]
[1,2,3,4,5], (3,3,4) -> []
[1,2,3,4,5], (2,2,2) -> []
[1,2,3,4,5], (3,3,5) -> [[1,2,3,4,5]]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49], (2,6,6) -> [[1,2,3,4,5,6],[7,8,9,10,11,12],[13,14,15,16,17,18],[19,20,21,22,23,24],[25,26,27,28,29],[30,31,32,33,34],[35,36,37,38,39],[40,41,42,43,44],[45,46,47,48,49]]
这是一个代码高尔夫球,因此,请以您喜欢的语言尽可能少的字节为目标!
[a..b]
包括a
和排除b
,对吗?