Swift 解法详解:LeetCode 368《最大整除子集》

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 代码拆解
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

有时候我们会遇到这样的问题:给定一堆数,如何从中挑出一个子集,让这个子集里的每一对数都能互相整除?题目要求我们找出最大的这样一个子集。

这个问题看起来有点像是在“组团”,条件是必须能整除。其实背后是一个动态规划问题,用来锻炼我们对“子问题递推”的理解。

描述

题目给了一个数组 nums,里面是一些互不相同的正整数。我们要找出一个最大的子集 answer,使得里面的任意两个数 ab 满足:

  • a % b == 0,或者
  • b % a == 0

换句话说,要么一个能被另一个整除,要么反过来也能被整除。

示例 1:

输入: [1,2,3]
输出: [1,2]
解释: 其实 [1,3] 也对,因为 3 % 1 == 0。

示例 2:

输入: [1,2,4,8]
输出: [1,2,4,8]

题解答案

直观的思路是:

  1. 如果一个数可以整除另一个数,那它们更可能属于同一个子集。
  2. 子集要尽量大,所以我们需要在多个候选方案中找到“最长的那条链”。

动态规划的做法

  • 先把数组排序,因为小数更容易整除大数。

  • 用一个数组 dp[i] 表示以 nums[i] 结尾的最大整除子集的长度。

  • 遍历每个 nums[i],再和前面的数 nums[j] 去比较:

    • 如果 nums[i] % nums[j] == 0,说明能放在一起,那就更新 dp[i] = max(dp[i], dp[j] + 1)
  • 同时用一个 parent 数组来记录前驱,方便最后回溯出完整的子集。

题解代码分析

下面是 Swift 的实现:

import Foundationclass Solution {func largestDivisibleSubset(_ nums: [Int]) -> [Int] {if nums.isEmpty { return [] }let nums = nums.sorted()let n = nums.countvar dp = Array(repeating: 1, count: n) // 每个数至少能独立成一个集合var parent = Array(repeating: -1, count: n) // 用来回溯路径var maxLen = 1var maxIndex = 0for i in 1..<n {for j in 0..<i {if nums[i] % nums[j] == 0 {if dp[j] + 1 > dp[i] {dp[i] = dp[j] + 1parent[i] = j}}}if dp[i] > maxLen {maxLen = dp[i]maxIndex = i}}// 回溯答案var result = [Int]()var k = maxIndexwhile k != -1 {result.append(nums[k])k = parent[k]}return result.reversed()}
}// MARK: - Demo 演示
let solution = Solution()
print(solution.largestDivisibleSubset([1, 2, 3]))    // [1, 2] 或 [1, 3]
print(solution.largestDivisibleSubset([1, 2, 4, 8])) // [1, 2, 4, 8]
print(solution.largestDivisibleSubset([3, 5, 10, 20, 21])) // [5, 10, 20]

代码拆解

  1. 排序

    • 把数组排好序,保证前面的数比后面的小,便于判断整除关系。
  2. 动态规划数组 dp

    • dp[i] 表示以 nums[i] 结尾的最大整除子集的长度。
  3. 前驱数组 parent

    • parent[i] 记录了 nums[i] 前面可以接上的数字位置,用来回溯结果。
  4. 两层循环

    • 外层 i 表示当前要计算的数。
    • 内层 j 遍历比它小的数,看能不能整除。
  5. 回溯结果

    • 从最大长度的下标开始,不断回溯 parent,拼成最终的子集。

示例测试及结果

运行 Demo,结果如下:

输入: [1, 2, 3]
输出: [1, 2]   // 或 [1, 3]输入: [1, 2, 4, 8]
输出: [1, 2, 4, 8]输入: [3, 5, 10, 20, 21]
输出: [5, 10, 20]

这个结果是合理的,比如 [5, 10, 20] 就是一条完整的整除链:

  • 10 % 5 == 0
  • 20 % 10 == 0

时间复杂度

  • 外层循环 i 最多跑 n 次,内层循环 j 也最多 n 次。
  • 所以时间复杂度是 O(n²)
  • n <= 1000 的范围内,这个复杂度是可接受的。

空间复杂度

  • 使用了 dpparent 两个数组,各占 O(n)
  • 回溯的结果也是 O(n)。
  • 所以整体空间复杂度是 O(n)

总结

这道题的关键在于 先排序,再动态规划

  • 排序后更容易保证“整除链”的关系。
  • 动态规划帮我们一步步延长最长的整除子集。

如果用现实场景来打个比方:

  • 你可以把每个数想象成一个“圈子”,只有能整除的才能成为同一个圈子。
  • 我们要找的,就是那个能容纳最多成员的“最大圈子”。

这类题目训练了我们对 递推关系 的思考能力,也再次证明了排序在动态规划里的重要作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921156.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python数据分析 与spark、hive数据分析对比

Python 数据分析与 Spark、Hive 数据分析在应用场景、数据处理能力、编程模型等方面存在差异&#xff0c;以下是详细对比&#xff1a;​数据处理规模​Python 数据分析&#xff1a;​特点&#xff1a;Python 数据分析常用库如Pandas&#xff0c;在单机环境下对中小规模数据集&a…

专题:2025全球新能源汽车供应链核心领域研究报告|附300+份报告PDF、数据仪表盘汇总下载

原文链接&#xff1a;https://tecdat.cn/?p43781 原文出处&#xff1a;拓端抖音号拓端tecdat 2024年&#xff0c;全球汽车产业站在了“旧秩序打破、新格局建立”的十字路口——一边是传统供应链受宏观经济波动、地缘博弈冲击&#xff0c;全球零部件企业营收首次出现负增长&…

从数据孤岛到智能中枢:RAG与智能体协同架构如何重塑企业知识库

1. 前言企业知识管理正面临前所未有的挑战。分散在各个系统中的文档、报告、邮件和数据库形成了数据孤岛&#xff0c;而大语言模型在缺乏准确知识支撑时容易产生幻觉回答。这种矛盾催生了检索增强生成&#xff08;RAG&#xff09;技术的快速发展。RAG不仅仅是技术组合&#xff…

UBUNTU之Onvif开源服务器onvif_srvd:2、测试

运行 # eth0: 网卡 # 192.168.0.229: IPsudo ./onvif_srvd \--ifs eth0 \--scope onvif://www.onvif.org/name/TestDev \--scope onvif://www.onvif.org/Profile/S \--name RTSP \--width 800 --height 600 \--url rtsp://192.168.0.229:554/unicast \--type JPEG 测试 使用…

项目中常用的git命令

Git介绍Git是一个分布式版本控制系统&#xff0c;主要作用就是记录代码的历史变化&#xff0c;让开发者可以查看任意时间点的代码&#xff0c;回滚到某个历史版本&#xff0c;对比不同版本之间的差异。在企业开发中&#xff0c;通过是通过多人协作开发&#xff0c;具体分支可以…

C 语言标准输入输出库:`stdio.h` 的使用详解

1. 概述 在 C 语言中&#xff0c;stdio.h&#xff08;Standard Input Output Header&#xff09;是一个标准库头文件&#xff0c;主要用于提供输入与输出功能。几乎所有的 C 程序都会用到它&#xff0c;因为它定义了用于读取、写入、格式化、文件操作等常用函数。 要在程序中使…

flume扩展实战:自定义拦截器、Source 与 Sink 全指南

flume扩展实战&#xff1a;自定义拦截器、Source 与 Sink 全指南 Flume 内置的组件虽然能满足大部分场景&#xff0c;但在复杂业务需求下&#xff08;如特殊格式数据采集、定制化数据清洗&#xff09;&#xff0c;需要通过自定义组件扩展其功能。本文将详细讲解如何自定义 Flu…

【数学建模】数学建模应掌握的十类算法

【数学建模】数学建模应掌握的十类算法前言数学建模竞赛官网1. 全国大学生数学建模竞赛官网2. 美国大学生数学建模竞赛官网3. Matlab 网站4. 研究生数学建模竞赛官网数学建模应掌握的十类算法1. 蒙特卡罗方法(Monte-Carlo方法, MC)2. 数据拟合、参数估计、插值等数据处理算法3.…

物联网开发学习总结(1)—— IOT 设备 OTA 升级方案

在物联网设备数量呈指数级增长的今天&#xff0c;如何高效、可靠地实现设备固件升级&#xff08;OTA&#xff09;成为了每个物联网开发者必须面对的重要课题。传统的HTTP升级方案虽然简单易用&#xff0c;但随着设备规模的扩大&#xff0c;其局限性日益明显。 一、HTTP OTA升级…

正运动控制卡学习-网络连接

一.硬件介绍使用正运动控制卡ECI1408进行学习&#xff0c;使用正运动函数库进行设置&#xff0c;并参考网络视频等进行学习记录&#xff0c;侵权删除.二.使用C#创建连接界面三.创建运动卡类3.1.创建IP连接字段private string IP; //连接IP public Inptr IPHandle&#xff1b;//…

存算一体:重构AI计算的革命性技术(1)

存算一体&#xff1a;重构AI计算的革命性技术 一、从存储墙到存算一体&#xff1a;计算架构的百年变革 1.1 冯诺依曼架构的困境与突破 在计算机发展的历史长河中&#xff0c;存储与计算的分离一直是制约性能提升的关键瓶颈。1945年&#xff0c;计算机科学家冯诺依曼提出了现代计…

Linux之centos 系统常用命令详解(附实战案例)

CentOS 系统常用命令详解&#xff08;附实战案例&#xff09; 前言 本文针对 CentOS 7/8 系统&#xff0c;整理了运维工作中高频使用的命令&#xff0c;涵盖系统信息、文件操作、用户权限、软件管理、服务控制、网络配置等核心场景&#xff0c;并结合实战案例说明具体用法&…

生成知识图谱与技能树的工具指南:PlantUML、Mermaid 和 D3.js

摘要本文详细介绍了生成知识图谱、技能树和桑基图的工具&#xff0c;包括 PlantUML、Mermaid 和 D3.js&#xff0c;以及它们的概念、原理和使用方法。文档为前端开发提供了示例知识图谱、技能树和桑基图&#xff0c;并为新手提供了在线编辑器和 VS Code 的操作步骤&#xff0c;…

如何正确使用ChatGPT做数学建模比赛——数学建模AI使用技巧

文章转自川川菜鸟&#xff1a;如何正确使用ChatGPT做数学建模比赛 引言 数学建模竞赛是将数学理论应用于解决现实世界问题的一项重要赛事。在这类比赛中&#xff0c;学生团队通常需要在有限时间内完成从问题分析、模型构建、算法实现到结果分析和论文撰写的一整套流程。这对参…

存算一体:重构AI计算的革命性技术(3)

四、存算一体技术的未来发展趋势与前景 4.1 技术发展&#xff1a;从“单点突破”到“多维度融合” 4.1.1 新型存储介质&#xff1a;忆阻器成核心方向 未来5-10年&#xff0c;忆阻器&#xff08;RRAM&#xff09;将成为存算一体芯片的主流存储介质&#xff0c;关键突破集中在三方…

LangChain开源LLM集成:从本地部署到自定义生成的低成本落地方案

LangChain开源LLM集成&#xff1a;从本地部署到自定义生成的低成本落地方案 目录 核心定义与价值底层实现逻辑代码实践设计考量替代方案与优化空间 1. 核心定义与价值 1.1 本质定位&#xff1a;开源LLM适配机制的桥梁作用 LangChain的开源LLM适配机制本质上是一个标准化接口…

记录一下node后端写下载https的文件报错,而浏览器却可以下载。

用node 写的下载&#xff0c;直接报错error downloading or exxtraction file: unable to verify the first certificate 根据此信息也是排查了老半天了。浏览器却可下载。问了ai之后才发现&#xff0c;证书如果不完整&#xff0c;浏览器会自动补全证书。 先用此网站SSL Serv…

Spring AI调用sglang模型返回HTTP 400分析处理

Spring AI调用sglang模型返回HTTP 400分析处理 一、问题描述 环境 java21springboot: 3.5.5spring-ai: 1.0.1 问题描述 Spring AI调用公司部署的sglang大模型返回错误HTTP 400 - {"object":"error","message":[{type: missing, loc: (body,), ms…

rust学习之开发环境

工具链 安装 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh确认 ethanG5000:~$ rustc --version rustc 1.89.0 (29483883e 2025-08-04)创建工程 创建 cargo new demo上述&#xff0c;demo为工程名称。 调试 cargo run静态编译 目前计划使用rust编写一些小工具。…

计算机毕业设计选题推荐:基于Python+Django的新能源汽车数据分析系统

精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、项目介绍二…