首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >至少包含3个连续元素的{1,2,3,…,N}子集的数目

至少包含3个连续元素的{1,2,3,…,N}子集的数目
EN

Stack Overflow用户
提问于 2012-09-07 04:53:13
回答 4查看 9.4K关注 0票数 3

假设我们有一个像{1,2,3}这样的集合,那么只有一种选择三个连续数字的方法.这是集合{1,2,3}..。

对于一组{1,2,3,4},我们有三种方法:123 234 1234

(从技术上讲,这些都是无序的数字集,但连续地编写它们会有所帮助)

  • f(5);{1,2,3,4,5} -> 8 ways:123 1234 1235 12345 234 2345 345 1345
  • f(6);{1,2,3,4,5,6} -> 20方式:.
  • f(7);{1,2,3,4,5,6,7} -> 47方式:.

所以对于给定的N,我可以通过施加蛮力来得到答案,并计算出所有这类子集都有3个或更多的连续数。

这里我只是想找出一种模式,一种获得给定N的所有这类子集的数目的技术。

该问题进一步推广到N的一组.....discover m连续数中。

EN

回答 4

Stack Overflow用户

发布于 2012-09-07 05:00:55

对我来说这听起来像是家庭作业,所以我就让你开始吧。FoOne方法是考虑运行的最低和最高成员,L和H。如果集合大小为N,最小运行长度为M,那么对于L的每一个可能的位置P,您可以计算出H有多少个位置.

票数 0
EN

Stack Overflow用户

发布于 2012-09-07 05:03:37

不确定你指的是连续还是不连续。如果没有,则对于{1,2,3,4}有4种可能性:{1,2,3} {2,3,4} {1,3,4} {1,2,3,4}

我想你可以用N!/3计算出这个解!其中N!= N*(N-1)(N-2)...*1.

票数 0
EN

Stack Overflow用户

发布于 2012-09-07 05:09:07

使用一些python代码,我们可以研究以下内容:

代码语言:javascript
复制
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)

这个解决方案将非常慢(实际上,它的复杂性是指数级的),但是尝试一下,对于一些小的列表大小,我认为您应该能够获得这种模式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12311918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档