我有一个这样的数组:
0011011100011111001
我想在这个数组中找到最长的1的序列,记下起点的长度和位置,这里长度为5,起点为12。
关于如何解决此问题的任何想法?
答案 0 :(得分:1)
我同意它看起来像家庭作业,但我这样做的方式是存储当前1次运行的开始和长度以及最长运行的开始和长度。遍历数组。每当从0更改为1时,更新当前开始位置并将长度设置为1.当长度超过最长时,更新最长和起点。这在输入的长度中以O(n)运行。这不包括边缘情况,例如没有1的数组。
答案 1 :(得分:1)
迭代数组,保持到目前为止找到的最大连续数的计数,以及当前连续数的单独计数。
let max_consec = 0
let curr_consec = 0
let i = 0
while i < array.size:
if array[i] is 1:
curr_consec++
else:
max_consec = Max(max_consec, curr_consec)
curr_consec = 0
i++
经过一番思考,你应该能够自己弄清楚如何跟踪起始位置。
答案 2 :(得分:0)
您可以将起始位置和长度最初设置为零,然后逐个遍历数组元素,使用简单的状态机跟踪1
和0
之间的转换。
状态表如下所示:
+----------------------------------------+
| lastNum |
+------------------+---------------------+
| 0 | 1 |
+---------+---+------------------+---------------------+
| | 0 | Just get next | Check/update runLen |
| | | character | against previous |
| thisNum +---+------------------+---------------------+
| | 1 | Store runPos , | Increment runLen |
| | | set runLen to 0 | |
+---------+---+------------------+---------------------+
由于您只对1
序列感兴趣,因此初始状态lastNum
设置为零,以确保开始时1
正确开始运行。我们还设置了初始的“迄今为止最大的运行”,其大小和位置为零,以确保它被第一次真实运行覆盖。
此方法有一个特殊的边缘情况,因为我们必须检测列表中的最终数字是否为1
- 如果是这样,则表示在结尾处没有1 -> 0
转换用于检查1
号码的最终运行的列表。
由于我们将在不检查最终运行的情况下退出循环,因此我们最终检查,就好像我们正在从1
转换为0
。
伪代码就是这样的。首先,所有变量的初始化:
# Store the current maximum run of '1' characters (none) and initial state.
var maxLen = 0, maxPos = 0, lastNum = 0
# runLen and runPos will be set in a 0->1 transition before we use them.
var rnLen, runPos
然后我们可以简单地迭代列表中的每个数字,并按照上图检测转换:
# Iterate over entire list, one by one.
for curPos = 0 to len(list) - 1:
# 0 -> 0: do nothing.
# 0 -> 1: store position, set run length to 1.
if lastNum == 0 and list[curPos] == 1:
runPos = curPos
runLen = 1
endif
# 1 -> 1: increment the current run length.
if lastNum == 1 and list[curPos] == 1:
runLen = runLen + 1
endif
# 1 -> 0: check current run against greatest to date.
if lastNum == 1 and list[curPos] == 0:
if runLen > maxLen:
maxPos = runPos
maxLen = runLen
endif
endif
# Save current number into lastNum for next iteration.
lastNum = list[curPos]
endfor
然后,最后,处理上述边缘情况:
# If we finished with a `1`, need to check final run.
if lastNum = 1:
if runLen > maxLen:
maxPos = runPos
maxLen = runLen
endif
endif