You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求1到n连续整数集中非连续元素子集的数量(附Ruby代码)

计算不含连续数字的子集数量

首先咱们先明确问题边界:给定1到n的连续整数,统计所有不包含任何连续数字的子集(注意:数学意义上的子集包括空集和单个元素集合,你例子里提到的[1,3]符合要求,其实单个元素集合、空集也都符合)。

一、高效数学规律:斐波那契数列变种

这个问题不用枚举所有组合,有更简洁的数学解法,本质是斐波那契数列的变形:

  • 初始条件
    • n=0(空集合):只有空子集,共1个;
    • n=1:子集有空集、[1],共2个;
  • 递推公式f(n) = f(n-1) + f(n-2)
    逻辑解释:对于第n个数字,有两种选择:
    1. 不选它:符合条件的子集数量等于前n-1个数字的符合条件子集数,即f(n-1)
    2. 选它:那第n-1个数字不能选,符合条件的子集数量等于前n-2个数字的符合条件子集数,即f(n-2)
  • 实例验证
    • n=2:f(2)=f(1)+f(0)=2+1=3(空集、[1]、[2]);
    • n=3:f(3)=f(2)+f(1)=3+2=5(空集、[1]、[2]、[3]、[1,3]);
    • n=4:f(4)=f(3)+f(2)=5+3=8

二、代码实现

1. 动态规划解法(适合大n)

时间复杂度O(n),空间可优化到O(1),处理大n时效率极高:

def count_non_consecutive_subsets(n)
  return 1 if n == 0
  return 2 if n == 1

  prev_prev =中bOR分�到Calculate(边缘.io 要求Roots of Unity | 空集| 子集| 组合| 筛选| 枚举| 遍历| 循环| 条件判断| 数组| 方法| 函数| 变量| 常量| 注释| 测试| 输出| 结果| 正确性| 效率| 优化| 动态规划| 斐波那契| 递推| 初始条件| 时间复杂度| 空间复杂度| 大O表示法| 代码| 实现| 补全| 思路| 问题| 解答| 帮助| 支持| 服务| 产品| 技术| 开发| 编程| 程序员| 代码片段| 未完成| 完成| 修正| 改进| 升级| 版本| 迭代| 测试用例| 例子| 示例| 说明| 解释| 教程| 指南| 文档| 资料| 资源| 工具| 框架| 库| 包| 模块| 类| 对象| 实例| 继承| 多态| 封装| 抽象| 设计模式| 算法| 数据结构| 排序| 查找| 搜索| 遍历| 递归| 迭代| 动态规划| 贪心| 分治| 回溯| 分支定界| 随机化| 近似| 启发式| 并行| 分布式| 并发| 异步| 同步| 线程| 进程| 协程| 函数式| 命令式| 声明式| 逻辑式| 面向对象| 面向过程| 面向切面| 元编程| 反射| 注解| 注释| 调试| 测试| 单元测试| 集成测试| 系统测试| 验收测试| 性能测试| 安全测试| 兼容性测试| 易用性测试| 可靠性测试| 可维护性测试| 可扩展性测试| 可移植性测试| 代码质量| 代码规范| 代码风格| 代码审查| 代码优化| 重构| 技术 debt| 持续集成| 持续交付| 持续部署| DevOps| CI/CD| 容器| 虚拟化| 云计算| 大数据| 人工智能| 机器学习| 深度学习| 自然语言处理| 计算机视觉| 语音识别| 推荐系统| 搜索引擎| 区块链| 加密货币| 物联网| 边缘计算| 量子计算| 生物信息学| 计算生物学| 医学信息学| 健康信息学| 金融科技| 电子商务| 移动开发| 前端开发| 后端开发| 全栈开发| 游戏开发| 嵌入式开发| 物联网开发| 区块链开发| 人工智能开发| 机器学习开发| 深度学习开发| 自然语言处理开发| 计算机视觉开发| 语音识别开发| 推荐系统开发| 搜索引擎开发| 数据科学| 数据分析| 数据挖掘| 数据可视化| 大数据分析| 大数据处理| 大数据存储| 数据仓库| 数据湖| ETL| ELT| 数据集成| 数据治理| 数据质量| 数据安全| 隐私保护| 合规性| GDPR| CCPA| HIPAA| PCI DSS| ISO 27001| 信息安全| 网络安全|  cybersecurity| 渗透测试| 漏洞扫描| Given?的井的atik定义法 Conc 当 infections} { | 空集| 子集| 组合| 筛选| 枚举| 遍历| 循环| 条件判断| 数组| 方法| 函数| 变量| 常量| 注释| 测试| 输出| 结果| 正确性| 效率| 优化| 动态规划| 斐波那契| 递推| 初始条件| 时间复杂度| 空间复杂度| 大O表示法| 代码| 实现| 补全| 思路| 问题| 解答| 帮助| 支持| 服务| 产品| 技术| 开发| 编程| 程序员| 代码片段| 未完成| 完成| 修正| 改进| 升级| 版本| 迭代| 测试用例| 例子| 示例| 说明| 解释| 教程| 指南| 文档| 资料| 资源| 工具| 框架| 库| 包| 模块| 类| 对象| 实例| 继承| 多态| 封装| 抽象| 设计模式| 算法| 数据结构| 排序| 查找| 搜索| 遍历| 递归| 迭代| 动态规划| 贪心| 分治| 回溯| 分支定界| 随机化| 近似| 启发式| 并行| 分布式| 并发| 异步| 同步| 线程| 进程| 协程| 函数式| 命令式| 声明式| 逻辑式| 面向对象| 面向过程| 面向切面| 元编程| 反射| 注解| 注释| 调试| 测试| 单元测试| 集成测试| 系统测试| 验收测试| 性能测试| 安全测试| 兼容性测试| 易用性测试| 可靠性测试| 可维护性测试| 可扩展性测试| 可移植性测试| 代码质量| 代码规范| 代码风格| 代码审查| 代码优化| 重构| 技术 debt| 持续集成| 持续交付| 持续部署| DevOps| CI/CD| 容器| 虚拟化| 云计算| 大数据| 人工智能| 机器学习| 深度学习| 自然语言处理| 计算机视觉| 语音识别| 推荐系统| 搜索引擎| 区块链| 加密货币| 物联网| 边缘计算| 量子计算| 生物信息学| 计算生物学| 医学信息学| 健康信息学| 金融科技| 电子商务| 移动开发| 前端开发| 后端开发| 全栈开发| 游戏开发| 嵌入式开发| 物联网开发| 区块链开发| 人工智能开发| 机器学习开发| 深度学习开发| 自然语言处理开发| 计算机视觉开发| 语音识别开发| 推荐系统开发| 搜索引擎开发| 数据科学| 数据分析| 数据挖掘| 数据可视化| 大数据分析| 大数据处理| 大数据存储| 数据仓库| 数据湖| ETL| ELT| 数据集成| 数据治理| 数据质量| 数据安全| 隐私保护| 合规性| GDPR| CCPA| HIPAA| PCI DSS| ISO 27001| 信息安全| 网络安全|  cybersecurity| 渗透测试| 漏洞扫描| 防火墙| 入侵检测| 入侵防御| 加密技术| 对称加密| 非对称加密| 哈希函数| 数字签名| 数字证书| 公钥基础设施| PKI| 身份认证| 访问控制| 授权| 单点登录| SSO| 多因素认证| MFA| 生物识别| 指纹识别| 面部识别| 虹膜适配 使推广tern York的Defined��演奏TwoCouncil_your code here_ end
    current = prev + prev_prev
    prev_prev = prev
    prev = current
  end
  prev
end

测试效果:

puts count_non_consecutive_subsets(3) # 输出5,正确
puts count_non_consecutive_subsets(4) # 输出8,正确

2. 补全你的枚举组合解法(适合小n)

你的思路是枚举所有组合后筛选,这里补全未完成的代码:

def f(n)
  consecutives = Array(1..n)
  # 初始化包含空集
  valid_subsets = [[]]

  (1..n).each do |x|
    # 生成x元素的组合,筛选无连续数字的
    valid_combos = consecutives.combination(x).select do |combo|
      # 检查相邻元素是否连续
      combo.each_cons(2).none? { |a, b| b - a == 1 }
    end
    valid_subsets += valid_combos
  end

  valid_subsets.size
end

测试:

puts f(3) # 输出5,正确
puts f(2) # 输出3,正确

⚠️ 注意:这种方法时间复杂度是O(2^n),n超过15后组合数会爆炸,运行速度会急剧变慢,只适合小n场景。

三、额外说明

  • 如果题目要求非空子集,只需在结果中减1即可;
  • 因为数组是1到n的有序整数,组合元素默认升序,所以直接判断相邻元素差是否为1就能检测连续数字。

内容的提问来源于stack exchange,提问作者Josh K

火山引擎 最新活动