您是一位年轻的编程爱好者,与另外2个最好的朋友一起生活。每个星期,其中一个人必须完成房子的所有杂务,然后通过挑一根棍子来决定轮到谁。挑短棍的人会输掉所有的琐事。
由于所有人都是程序员,并且喜欢创建难题,因此您已将“选择最短的棍子”修改为计算机难题。
这是难题的规则。
- 您将获得一个2D矩阵,其中每列代表一根棍子。
- 在每一列中,1代表棒的一部分,0代表空白
- 当在每列从顶部到底,最初你
0
的,一旦你打1
,棍子已经开始休息的列将充满1
只有 - 您可以编写程序来选择一列。该栏中棍子的大小决定了获胜者/失败者。棒的大小==该列中的1s数。
- 但是,该程序只能具有线性最坏情况下的时间复杂度。
由于所有人都是程序员,因此您将知道其他人的程序是否正在限制时间复杂度极限。
您的工作是:
- 编写接受2D格式或字符串数组输入的程序或函数。
- 输入可以从STDIN /提示/控制台或函数参数中获取。
- 如果您正在从STDIN / prompt读取输入,则可以假定读取输入并将其转换为数组需要0倍的时间(即使您的答案中必须有这样做的代码)
- 确定其中最长的棍子。
- 输出可以是函数的返回值,也可以是STDOUT /控制台/警报。
- 程序/函数必须具有线性最坏情况下的时间复杂度,
O(m+n)
其中m
为行n
数和列数。
输入可以是以下格式之一:
2D阵列:
[ [0, 0, 0, 0],
[1, 0, 0, 0],
[1, 1, 0, 1],
[1, 1, 1, 1] ]
字符串数组:
[ "0000", "1000", "1101", "1111" ]
输入将具有以下属性:
- 数组的大小未知,假定任何大小的矩形
- 在任何一列中,自上而下,如果您看到1,则下面的所有内容均为1
- 空柱(即0长度)棒被允许的。
这是一个代码高尔夫球,因此最短的代码胜出!*
请说明您的代码,或提供非公开版本(以验证时间复杂度)以及您期望的两种输入格式中的哪一种。
更新 这里的线性时间复杂度表示O(n + m),其中n是列大小,m是行大小。(对于那些不清楚的人)
更新2 这绝对可以在线性时间内完成。如果您要发布答案,请随时将逻辑/算法的发布推迟几天,以进行公平竞争:)
更新3我将在几个小时内仔细研究所有答案,以验证时间复杂度和程序:)
1
输入中唯一的是最后一个单元有必要读取整个输入。即使一种语言的标准库伪造了对stdin的随机访问,在后台它也会对其进行缓冲,因此所花费的时间为Omega(n * m)。