规格
这个挑战很容易说明:您的输入是一个非负整数的非空数组,您的任务是将其划分为尽可能少的递增子序列。更正式地讲,如果输入数组是A
,则输出是一个数组数组B
,使得:
- 每个阵列
B
形成A
不相交(不一定是连续的)子序列的分区。在归纳法上,这意味着要么B
是包含的单例数组,要么是的A
第一个元素B
是的子序列,A
其余部分形成的分区,A
并且删除了该子序列。 B
(不一定严格)增加每个数组。- 中的数组数量
B
最少。
输入和输出都可以采用您语言的本机数组格式。请注意,可能有几个正确的输出。
例
考虑输入数组A = [1,2,1,2,5,4,7,1]
。一种可能的输出是B = [[1],[1,2,4,7],[1,2,5]]
。从此图可以明显看出分区条件:
A 1 2 1 2 5 4 7 1
B[0] 1
B[1] 1 2 4 7
B[2] 1 2 5
同样,每个数组都在B
增加。最后,A
由于不能分为两个递增的子序列,因此的长度B
也很短。因此,这是有效的输出。
规则和计分
您可以编写函数或完整程序。最低字节数获胜,并且不允许出现标准漏洞。没有时间限制,但是您应该在提交所有测试用例之前对解决方案进行评估。
测试用例
仅显示一个可能的输出,但可能有多个有效选项。特别地,结果中数组的顺序无关紧要(但每个单独的数组应按递增顺序排列)。
[0] -> [[0]]
[3,5,8] -> [[3,5,8]]
[2,2,2,2] -> [[2,2,2,2]]
[1154,1012,976,845] -> [[845],[976],[1012],[1154]]
[6,32,1,2,34,8] -> [[1,2,8],[6,32,34]]
[1,12,1,12,1,13] -> [[1,1,1,13],[12,12]]
[6,4,6,13,18,0,3] -> [[0,3],[4,6,13,18],[6]]
[1,2,3,2,3,4,7,1] -> [[1,1],[2,2,3,4,7],[3]]
[0,9,2,7,4,5,6,3,8] -> [[0,2,3,8],[4,5,6],[7],[9]]
[7,1,17,15,17,2,15,1,6] -> [[1,1,6],[2,15],[7,15,17],[17]]
[4,12,2,10,15,2,2,19,16,12] -> [[2,2,2,12],[4,10,15,16],[12,19]]
[10,13,9,2,11,1,10,17,19,1] -> [[1,1],[2,10,17,19],[9,11],[10,13]]
[3,7,3,8,14,16,19,15,16,2] -> [[2],[3,3,8,14,15,16],[7,16,19]]
[15,5,13,13,15,9,4,2,2,17] -> [[2,2,17],[4],[5,9],[13,13,15],[15]]
@feersum并不是故意的,很好。我已重写的条件
—
Zgarb 2015年
B
,希望现在可以更清楚了。
[0,5,2,0] -> [[0,5],[0,2]]
(例如,回收第一个零而不是每个都使用一次)。那是故意的吗?