Permutation 和 Combination

2023-11-18


Permutation 和 Combination是算法中非常常见的两种数据的排列方式,也就是数学中的排列和组合。

Permutation: 排列,指从给定个数的元素中取出指定个数的元素进行排序。
Combination: 组合,指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。

本文的主要目的在于总结在算法题中,这两种类型题目的做题模板。虽然题目变化可能是多样的,但是万变不离其宗。


Permutation

以leetcode题目46. Permutations为例。

题目叙述如下:

Given an array nums of distinct integers, return all the possible permutations. You can return the answer in any order.

Example

Input: nums = [1,2,3]
Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

代码

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> ans = new ArrayList<>();
        dfs(ans, new ArrayList<>(), 0, nums);
        return ans;
    }
    
    private void dfs(List<List<Integer>> ans, List<Integer> list, int begin, int[] nums) {
        if (list.size() == nums.length) {
            ans.add(new ArrayList<>(list));
            return;
        }
        
        if (begin >= nums.length) {
            return;
        }
        
        for (int i = begin; i < nums.length; i++) {
            swap(nums, begin, i);
            list.add(nums[begin]);
            dfs(ans, list, begin + 1, nums);
            list.remove(list.size() - 1);
            swap(nums, begin, i);
        }
        return;
    }
    
    private void swap(int[] nums, int a, int b) {
        int tmp = nums[a];
        nums[a] = nums[b];
        nums[b] = tmp;
    }
}

代码核心思路

  1. DFS;
  2. 交换(如题目中的swap)
  3. 保存中间结果(如函数dfs的第二个参数List<Integer> list
  4. 保存最终结果(如函数dfs的第一个参数List<List<Integer>> ans)
  5. 恢复现场(list.remove(list.size() - 1))

Combination

以leetcode题目combination-sum-iii为例。

题目叙述如下:

Find all valid combinations of k numbers that sum up to n such that the following conditions are true:
Only numbers 1 through 9 are used.
Each number is used at most once.
Return a list of all possible valid combinations. The list must not contain the same combination twice, and the combinations may be returned in any order.

Example

Input: k = 3, n = 7
Output: [[1,2,4]]
Explanation:
1 + 2 + 4 = 7
There are no other valid combinations.

代码

class Solution {
    
    public List<List<Integer>> combinationSum3(int k, int n) {
        List<List<Integer>> ans = new ArrayList<>();
        dfs(ans, k, n, new ArrayList<>(), 1);
        return ans;
    }
    
    private void dfs(List<List<Integer>> ans, int k, int n, List<Integer> list, int begin) {
        if (n == 0 && list.size() != 0 && k == 0) {
            ans.add(new ArrayList<Integer>(list));
            return;
        }
        
        if (n < 0 || begin > 9 || k < 0) {
            return;
        }
        
        for (int i = begin; i <= 9; i++) {
            list.add(i);
            dfs(ans, k - 1, n - i, list, i + 1);
            list.remove(list.size() - 1);
        }
        return;
    }
}

代码核心思路

  1. DFS;
  2. 保存中间结果(如函数dfs的第四个参数List<Integer> list
  3. 保存最终结果(如函数dfs的第一个参数List<List<Integer>> ans)
  4. 恢复现场(list.remove(list.size() - 1))

总结

共同点:

  1. DFS
  2. 需要追踪中间结果
  3. 需要保存最终结果
  4. 需要恢复现场
  5. 根据需求在dfs函数内for循环来找答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Permutation 和 Combination 的相关文章

  • 机器学习算法实战案例:Informer实现多变量负荷预测

    文章目录 机器学习算法实战案例系列 答疑 技术交流 1 实验数据集 2 如何运行自己的数据集 3 报错分析 机器学习算法实战案例系
  • 「优选算法刷题」:快乐数

    一 题目 编写一个算法来判断一个数 n 是不是快乐数 快乐数 定义为 对于一个正整数 每一次将该数替换为它每个位置上的数字的平方和 然后重复这个过程直到这个数变为 1 也可能是 无限循环 但始终变不到 1 如果这个过程 结果为 1 那么这个
  • 『力扣刷题本』:逆波兰表达式求值

    大家好久不昂 最近 1 个多月罗根一直在备考期末 文章发的很少 现在已经放寒假啦 学习自然也不能拉下 毕竟 4 月份就要去参加蓝桥杯了 先给自己定个小目标 日更 2 篇 咳咳 下面马上开始讲题 一 题目 给你一个字符串数组 tokens 表
  • 用 sympy 反转排列

    在什么功能sympy combinatorics permutations可以返回给定排列的逆排列吗 在 Google 中搜索不会给出结果 我可以写这个函数 但是如果这个函数已经实现了sympy 这将是不必要的 谢谢你的帮助 您正在寻找 I
  • 字符串数组的排列

    我根本不知道如何解决这个问题 在谷歌上彻底搜索后没有结果 我向你求助 希望能找到解决方案 给出下面的示例数组 array Type gt array Toppe Bukser og Jeans Size gt array Extra sma
  • java中的排列迭代器

    我想要一个类 它接受一个正整数并生成一个迭代器 让我迭代该正整数下的正数列表的所有可能的排列 例如 模拟器 p paermulator 3 p next gt 0 1 2 p next gt 0 2 1 p next gt 1 0 2 p
  • JavaScript 中重复元素的独特排列

    假设我们有元素 0 和 1 它们可以出现多次 就像00 00 11 00 00 11 11 or 01 11 为了更好的可读性分成 2 组 我已经有一个函数来生成所有独特的排列 class UniqueElement constructor
  • 为什么 Python 的 itertools.permutations 包含重复项? (当原始列表有重复时)

    人们普遍认为 n 个列表distinct符号有 n 排列 然而 当符号不明确时 数学和其他领域最常见的约定似乎是仅计算不同的排列 因此列表的排列 1 1 2 通常被认为是 1 1 2 1 2 1 2 1 1 事实上 以下 C 代码准确地打印
  • 返回很大范围内的非重复随机值

    我想要一个函数 它可以从一组 n 个整数 0 到 n 1 中生成 k 个伪随机值 而不重复任何先前的结果 k小于或等于n O n 内存不可接受由于尺寸较大n以及我需要重新洗牌的频率 这些是我到目前为止考虑过的方法 Array 通常 如果我想
  • (任何语言)使用交换查找向量中元素的所有排列

    今天在实验室会议上有人问我这个问题 我们可以想象一个包含元素 1 N 1 长度为 N 的向量 是否存在生成向量中元素的所有排列或顺序的算法 系统 方法 一种建议的方法是交换随机元素 显然 如果存储所有先前生成的排列以供将来参考 那么这将起作
  • 运算符和操作数的排列算法

    我在一个面试网站上看到了这个问题 我们有 4 个数字 即 n1 n2 n3 n4 我们可以将它们放置在任何 顺序 我们可以在它们之间使用数学运算符 最终结果为 24 为此编写一个算法 需要 4 个数字并返回 false 或 true 最终结
  • 计算没有两个相邻字符相同的所有排列

    给定一个仅包含不同数量的数字 1 2 3 和 4 的序列 例如 13244 4442 等 我想计算其所有排列 以便没有两个相邻的数字是相同的 我相信它是 O N N 并且想知道是否有更好的 有人有主意吗 class Ideone stati
  • Makefile 排列

    Bash 可以产生排列 笛卡尔积 http wikipedia org wiki Cartesian product echo 1 2 a b 1a 1b 2a 2b 我想用 makefile 做类似的事情 这是一个例子 生成文件 all
  • 使用javascript在数组中组合单词

    假设我有一个数组 Alex Sam Robert 我想将它们组合起来 例如 获取第一个数组 0 并附加数组 2 这将是 AlexRobert array 0 的第一个字母是 A 并附加 array 2 的第一个字母 即 Robert 这将是
  • 仅一个循环的排序和非排序排列

    我想按照给定长度的字典顺序对一个周期的排列进行排名和取消排名 具有一个循环的排列是您可以在此循环中访问每个元素的位置 p 2 3 1 是一个循环的排列 排名1 p 3 1 2 也有 1 个循环 但等级为 2 因为排列在字典顺序上比第一个大
  • 在 R 中生成可能排列的随机、非重复子集

    Given p离散变量 我想随机选择 k他们可能的排列 换句话说 对于变量a in 0 1 and b in 1 2 3 两个随机排列将是 0 2 and 1 3 我想在不首先生成所有可能排列的表的情况下生成这些变量 因为随着变量数量及其可
  • 在 O(n) 中获取作为唯一给定索引的函数的排列

    我想要一个函数get permutation给定一个列表l和一个索引i 返回一个排列l这样排列对于所有人来说都是唯一的i大于0并低于n where n len l I e get permutation l i get permutatio
  • CUDA Thrust 和 sort_by_key

    我正在寻找 CUDA 上的排序算法 它可以对元素数组 A 双精度 进行排序 并返回该数组 A 的键 B 数组 我知道sort by keyThrust 库中的函数 但我希望元素数组 A 保持不变 我能做些什么 我的代码是 void sort
  • 有人可以解释一下这段代码吗?排列代码[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在做一
  • 生成总和为 N 的所有数字排列

    我正在编写一个程序来创建所有数字 起初 我尝试使用分区函数对数字进行分区 然后对每个数字集进行排列 但是我认为这行不通 最好的方法是递归排列 同时对数字求和 这超出了我的能力范围 抱歉 如果这听起来真的很愚蠢 但我真的不知道 Example

随机推荐

  • ad10怎么挖铺的铜_跟我学丨覆铜这样操作快!准!狠

    所谓覆铜 就是将PCB上闲置的空间作为基准面 然后用固体铜填充 这些铜区又称为灌铜 覆铜的意义在于 减小地线阻抗 提高抗干扰能力 降低压降 提高电源效率 与地线相连 减小环路面积 那么如何使用立创EDA覆铜呢 一 在PCB工具对话框里面 选
  • 2021-湖湘杯final-Web

    2021 湖湘杯final Web 前言 今年湖湘报的社企组的结果就是最后只能摆烂 然后决赛那段时间正好在复习期末 然后考完了想好好的休息一段时间 打游戏打累了再来复现一下湖湘杯final的题目放松放松 vote 今年HTB的基本上算是原题
  • javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint

    java 验证出现如下错误 javax validation UnexpectedTypeException HV000030 No validator could be found for constraint 错误原因 Java实体类中
  • 区块链的运行流程梳理记录

    目录 0 比特币交易流程 1 生成交易 2 网络传播与验证 3 交易池管理 4 交易优先级排序 5 交易手续费定价 6 共识竞争与构建区块 7 难度调整机制 8 分叉处理与主链判断 0 比特币交易流程 从交易的生命周期来看 比特币系统的交易
  • Is Usb Drive () ? DeviceIoControl, IOCTL_STORAGE_QUERY_PROPERTY

    http banderlogi blogspot com 2011 06 enum drive letters attached for usb html typedef enum STORAGE BUS TYPE BusTypeUnkno
  • Elasticsearch 相关度评分TF&IDF算法揭秘

    1 算法介绍 relevance score算法 简单来说 就是计算出 一个索引中的文本 与搜索的文本 他们之间的关联匹配程序 ElasticSearch使用的是term frequency inverse document frequen
  • 关于C++中cout.precision()的使用以及控制输出的小数位数.

    在C 中可以使用cout precison val 来控制浮点数的输出精度 但并不是意味着仅使用cout precison val 可以控制输出结果的小数点位数 在此记录一下 就当做学习笔记 下面先做一下简单的验证 include
  • NLP学习02_最大匹配算法、UniGram LM、Spell Correction

    如果没有数据的时候 那只能通过正则或者规则来解决问题 但是有些基于概率的方法 必须有一定的数据 首先我们要对句子进行切分 使用分词 接着进行预处理 拼写纠错 stemming 将不同的单词转换到原型 停用词过滤 a an 单词顾虑 同义词等
  • win7本地服务器如何添加网站,win7 添加本地服务器地址

    win7 添加本地服务器地址 内容精选 换一换 OBS Browser 是一款用于访问和管理对象存储服务的图形化工具 支持通过配置内网DNS服务器地址的方式 使在华为云上的Windows ECS通过内网直接访问OBS 下面将介绍具体其操作流
  • java写企业员工信息管理系统

    java写企业员工信息管理系统 这一篇文章主要介绍java写的企业员工信息管理系统 功能介绍 员工登录 首页 工资信息 出差记录 请假 签到 留言 修改密码 退出登录 管理员登录 员工管理 新增员工 工资信息 出差信息 请假信息 签到信息
  • RoboMaster机甲大师:裁判系统服务器搭建助手(RMServer Aid)

    RoboMaster机甲大师 裁判系统服务器搭建助手 RMServer Aid 更新 2022 03 28 写在前面 使用教程 软件简介 软件下载 软件安装 软件使用 打开软件 首次使用 1 组建局域网 2 配置RM环境 3 启动RM服务
  • vmware 磁盘扩容

    文章目录 参考 https blog csdn net zmzdmx article details 112299741 fdisk dev sda root localhost fdisk dev sda Welcome to fdisk
  • 二. SpringCloud Alibaba Sentinel 流控

    目录 一 简单介绍 二 流控模式 直接 快速失败 关联 快速失败 三 流控效果 快速失败 WarmUp 预热 排队等待 一 简单介绍 假设当前 Sentinel 监控的服务中有两个接口 针对整个服务 或针对服务中的指定接口添加流量控制设置
  • nodejs http模块

    客户端 在网络节点中 负责消费资源的电脑 叫做客户端 服务器 负责对外提供网络资源的电脑 叫做服务器 http 模块 是node js 官方提供的 用来创建web 服务器的模块 通过http 模块提供懂得 http caeateServer
  • 自删除技术详解

    基础知识 这里首先说一下程序自删除实现的思路 程序创建一个批处理文件 并创建进程执行 然后程序结束进程 批处理所做的功能便是延时5秒后 删除指定程序然后再自删除 这样 程序自删除功能便实现了 常用的有三种 自删除 技术 1 利用window
  • esp32-S3专题二:内存1之RAM使用

    esp32 S3模块内部的存储分为ROM RAM SPRAM RTC内存 FLASH 种类很多 几乎可以不使用外接存储器的情况下 可以进行很多业务场景 十分有用 现在我们逐一讲解一下他们的作用和使用方法 一 ROM 384 KB 内部 RO
  • Obsidian学习从0到1 —— MARKDOWN

    文章目录 1 认识markdown 2 使用markdown 常用语法 1 标题 2 加粗 斜体 删除线 3 列表 4 分级 5 引用 6 分割线 7 链接 8 代码块 9 任务列表 快捷方式 10 插入图像 11 表格支持 高级用法 1
  • 【STM32】入门(十三):FreeRTOS

    STM32 STM32单片机总目录 1 FreeRTOS简述 完全免费 FreeRTOS是完全免费的实时操作系统 源码简单 只需 3 个 RTOS 移植通用的源文件和 1 个微控制器专用的源文件 镜像较小 具有最小 ROM RAM 和处理开
  • 集简云上线ChatGPT文档问答,基于文档实现智能问答训练

    过去 我们想要让ChatGPT结合自身业务进行针对性回答 只能通过输入大量的prompt提示 或使用官方原生Fine Tuning模型训练 然而 过多的prompt提示词一方面提高了使用成本 另一方面 提示词的信息量有限 无法复用于不同的问
  • Permutation 和 Combination

    文章目录 Permutation 代码 代码核心思路 Combination 代码 代码核心思路 总结 Permutation 和 Combination是算法中非常常见的两种数据的排列方式 也就是数学中的排列和组合 Permutation