假设我们有一个类似{1,2,3}
的集合,那么只有一种方法可以选择3个连续的数字......它就是集合{1,2,3} ......
对于一组{1,2,3,4},我们有3种方式:123
234
1234
(从技术上讲,这些是无序的数字集,但连续写它们有帮助)
123
1234
1235
12345
234
2345
345
1345
因此,对于给定的N,我可以通过应用强力,并计算具有3个或更多连续数的所有这样的子集来得到答案。
这里我只是想找出一种模式,一种技术来获得给定N的所有这种子集的数量。
问题进一步推广到.....在一组大小N中发现m个连续数。
答案 0 :(得分:5)
在这个问题和“某个地方连续至少有三个连续1
的N位二进制数的数量之间存在一个双射”(如果在子集中排除,则双射数为0)如果包含在子集中则为1)。
这是一个众所周知的问题,如果您搜索number of n-digit binary strings with m consecutive 1s
,那么搜索2^n - tribonacci(n+3)
的搜索结果应该是Google的足够信息,第二次点击是Finding all n digit binary numbers with r adjacent digits as 1
或者你可以查看http://oeis.org/search?q=0%2C0%2C1%2C3%2C8%2C20%2C47(基于你在前几个术语中使用的强制执行) - 得到{{1}}的明确公式,请参阅here对于tribonacci数的显式公式。它还给出了递归关系。给出的类比是“在公平硬币的n个翻转中获得至少1次3头的概率(超过2 ^ n)”
我只能假设一般问题的答案是2 ^ n - F m (n + m),其中F m 是m th n-step Fibonacci number(编辑:seem to be the case )
答案 1 :(得分:0)
这听起来像是我的作业,所以我会让你开始。 FoOne方法是考虑运行的最低和最高成员,L和H.如果设置大小为N且您的最小运行长度为M,那么对于L的每个可能位置P,您可以计算出多少个位置我有..... ....
答案 2 :(得分:0)
不确定您的意思是否连续。如果没有,那么对于{1,2,3,4},有4种可能性:{1,2,3} {2,3,4} {1,3,4} {1,2,3,4} < / p>
我认为你可以用N!/ 3来计算解决方案!哪个N! = N *(N-1)(N-2) ... * 1.
答案 3 :(得分:0)
使用一些python代码,我们可以调查一下:
y = set()
def cons(li, num):
if len(li) < num:
return
if len(li) == num:
y.add(tuple([i for i in li]))
else:
y.add(tuple([i for i in li]))
cons(li[1:], num)
cons(li[:-1], num)
这个解决方案会非常慢(实际上它的复杂程度是指数),但是尝试一些小的列表大小,我认为你应该能够选择这种模式。
答案 4 :(得分:0)
Sequences(n) = (n-1)*(n-2) / 2
你可以通过归纳来做到这一点。首先,我将重新陈述问题,因为你的问题陈述不够明确。
规则1:对于所有连续数字组1..n其中n为2或更多
规则2:计算连续数m..m + q的子集S(n),其中q为2或更多
通过检查我们只找到一个 - 123
通过检查我们发现3! - 123 234和1234
请注意,S(4)包含S(3),加上两个新的......都包括新数字4 ... hmm。
通过检查我们发现...... S(n = 4)以及345 2345和12345.这是3 + 3 =总共6个。
我认为这里形成了一种模式。让我们定义一个新函数T。
我们知道S(n)包含数字n,并且现在应该发现S(n)还包含(作为子组件)所有包含数字n的长度为3到n的序列。我们知道它们不能在S(n-1)中,所以它们必须在T(n)中。
让我们回顾一下S(3)S(4)和S(5),并加入T(n):
让我们概括一下:
那么在给定的T中有多少?
回顾第5条规则 - 它描述了多少个序列?
对于T(4),它描述了以4结尾的所有序列3和更长的序列(即234)
对于T(5),它描述了所有序列3和更长的结尾为5.(即345 2345 = 2)
T count Examples
4 2 1234 234
5 3 12345 2345 345
6 4 123456 23456 3456 456
看起来非常像T(n)只是n-2!
所以
S(6) = T(6) + T(5) + T(4) + S(3)
10 = 4 + 3 + 2 + 1
和 S(7)= 15 = 5 + 4 + 3 + 2 + 1 S(8)= 21 = 6 + 5 + 4 + 3 + 2 + 1
什么是2 * S(8)?
42 = 6 + 5 + 4 + 3 + 2 + 1 + 1 + 2 + 3 + 4 + 5 + 6
添加每对最大和最小数字:
42 = 7 + 7 + 7 + 7 + 7 + 7
42 = 7 * 6
但那是2 * S(8),所以
S(8)= 42/2 = 21 = 7 * 6/2
这概括了:
S(n) = (n-1)*(n-2) / 2
让我们检查一下:
S(3) = 2*1/2 = 1
S(4) = 3*2/2 = 3
S(5) = 4*3/2 = 6
S(6) = 5*4/2 = 10
我很满意。