如何解决不使用 Count 功能对段进行计数
我遇到了下一个问题:给定一个数组,计算发生这种情况的长度为 k 的段数;片段左半部分的阳性数大于或等于右半部分。
举个例子(想象段只能是偶数,所以没有关于一半是什么的讨论):
k=2 ---> count(array[-4,-2,2,1],k) ---> 2,as [-4,-2] fulfills and also [2,1]
k=4 ---> count(array[-4,k) ---> 0,1] does not fulfil.
k=6 ---> count(array[-4,as there are not length 6 segments.
我使用函数 Count 以一种简单的方式递归地解决了这个问题:我从左到右移动数组,枚举所有长度为 k 的段,并对每个段应用计数。它是在达夫尼完成的:
function method Count_segments(sequ: seq<int>,seg_length:int): int
{
if |sequ| == 0 then 0
else (if (Count(x => x >= 0,sequ[0..seg_length/2])) >= (Count(x => x >= 0,sequ[seg_length/2..seg_length])) then
1 + if (|sequ|-1 < seg_length) then 0 //I add the condition that says that if in the next iteration,sequ will be smaller than the sequence_length,then we end.
else Count_segments(sequ[1..],seg_length)
else if (|sequ|-1 < seg_length) then 0
else Count_segments(sequ[1..],seg_length)
)
}
但是,很明显,使用 Count,我不会迭代地进行线性搜索(在第一个示例中,不是搜索 4 次,而是搜索 6 次)。我想在 O(n) 中实现它,但找不到任何信息,有人有想法吗?我不在乎编程语言(可以用任何语言回答我),而在乎算法本身。
谢谢!!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。