从n个元素中选择k个的所有组合(包含重复元素)

2023-05-16

LeetCode:Combinations这篇博客中给出了不包含重复元素求组合的5种解法。我们在这些解法的基础上修改以支持包含重复元素的情况。对于这种情况,首先肯定要对数组排序,以下不再强调

修改算法1:按照求包含重复元素集合子集的方法LeetCode:Subsets II算法1的解释,我们知道:若当前处理的元素如果在前面出现过m次,那么只有当前组合中包含m个该元素时,才把当前元素加入组合

class Solution {
public:
    void combine(vector<int> &vec, int k) {
        if(k > vec.size())return;
        sort(vec.begin(), vec.end());

        vector<int>tmpres;
        helper(vec, 0, k, 0, tmpres);
    }
    
    //从vec的[start,vec.size()-1]范围内选取k个数,tmpres是当前组合
    //times是上一个元素出现的次数
    void helper(vector<int> &vec, int start, int k, int times, vector<int> &tmpres)
    {
        if(vec.size()-start < k)return;
        if(k == 0)
        {
            for(int i = 0; i < tmpres.size(); i++)
                cout<<tmpres[i]<<" ";
            cout<<endl;
            return;
        }
        if(start == 0 || vec[start] != vec[start-1])//当前元素前面没有出现过
        {
            //选择vec[start]
            tmpres.push_back(vec[start]);
            helper(vec, start+1, k-1, 1, tmpres);
            tmpres.pop_back();
            //不选择vec[start]
            helper(vec, start+1, k, 1, tmpres);
        }
        else//当前元素前面出现过
        {
            if(tmpres.size() >= times && tmpres[tmpres.size()-times] == vec[start])
            {
                //只有当tmpres中包含times个vec[start]时,才选择vec[start]
                tmpres.push_back(vec[start]);
                helper(vec, start+1, k-1, times+1, tmpres);
                tmpres.pop_back();
            }
            helper(vec, start+1, k, times+1, tmpres);
        }
    }
};

从[1,2,2,3,3,4,5]中选3个的结果如下:

image


修改算法2:同理,可以得到代码如下                    本文地址

class Solution {
public:
    void combine(vector<int> &vec, int k) {
        if(k > vec.size())return;
        sort(vec.begin(), vec.end());

        vector<int>tmpres;
        helper(vec, 0, k, 0, tmpres);
    }
    
    //从vec的[start,vec.size()-1]范围内选取k个数,tmpres是当前组合
    //times是上一个元素出现的次数
    void helper(vector<int> &vec, int start, int k, int times, vector<int> &tmpres)
    {
        if(vec.size()-start < k)return;
        if(k == 0)
        {
            for(int i = 0; i < tmpres.size(); i++)
                cout<<tmpres[i]<<" ";
            cout<<endl;
            return;
        }
        for(int i = start; i <= vec.size()-k; i++)
        {
            if(i == 0 || vec[i] != vec[i-1])//当前元素前面没有出现过
            {
                times = 1;
                //选择vec[i]
                tmpres.push_back(vec[i]);
                helper(vec, i+1, k-1, 1, tmpres);
                tmpres.pop_back();
            }
            else//当前元素前面出现过
            {
                times++;
                //vec[i]前面已经出现过times-1次
                if(tmpres.size() >= times-1 && tmpres[tmpres.size()-times+1] == vec[i])
                {
                    //只有当tmpres中包含times-1个vec[i]时,才选择vec[i]
                    tmpres.push_back(vec[i]);
                    helper(vec, i+1, k-1, times, tmpres);
                    tmpres.pop_back();
                }
            }
        }
    }
};

修改算法3:算法3是根据LeetCode:Subsets 算法2修改未来,同理我们也修改LeetCode:SubsetsII 算法2

class Solution {
public:
    void combine(vector<int> &vec, int k) {
        if(k > vec.size())return;
        sort(vec.begin(), vec.end());

        vector<vector<int> > res(1);//开始加入一个空集
        int last = vec[0], opResNum = 1;//上一个数字、即将要进行操作的子集数量
        for(int i = 0; i < vec.size(); ++i) 
        {
            if(vec[i] != last)
            {
                last = vec[i];
                opResNum = res.size();
            }
            //如果有重复数字,即将操作的子集的数目和上次相同
            int resSize = res.size();
            for(int j = resSize-1; j >= resSize - opResNum; j--)
            {
                res.push_back(res[j]);
                res.back().push_back(vec[i]);
                if(res.back().size() == k)//找到一个大小为k的组合
                {
                    for(int i = 0; i < res.back().size(); i++)
                        cout<<res.back()[i]<<" ";
                    cout<<endl;
                }
            }
        }
    }
};

对于算法4和算法5,都是基于二进制思想,这种解法不适用与包含重复元素的情况

 

【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3695463.html

转载于:https://www.cnblogs.com/TenosDoIt/p/3695463.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从n个元素中选择k个的所有组合(包含重复元素) 的相关文章

  • Sums of Sums

    Alice presented her friend Bob with an array of N positive integers indexed from 1 to N She challenged Bob with many que
  • Effective C# 摘录(3) - 使用C#表达设计

    19 定义并实现接口优于继承类型 Prefer Defining and Implementing Interfaces to Inheritance 接口支持多重继承 xff0c 可以作用于值类型 xff0c 而抽象类则不可以 xff1b
  • 【转】使用windeployqt.exe进行依赖查找打包

    原文 xff1a https blog csdn net u011822862 article details 52166940 Qt 官方开发环境使用的动态链接库方式 xff0c 在发布生成的可执行程序时 xff0c 需要复制可执行程序的
  • 切换默认Activity和Fragment的动画

    Activity中 public void click View view Intent intent 61 new Intent intent setClass this TwoActivity class startActivity i
  • Spring配置文件基本作用

    Spring进行mvc开发中主要有三个配置文件web xml root context xml 名字可以自己更改 servlet context xml 名字可以自己更改 1 web xml作用 主要定义应用的上下文applicationC
  • Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?...

    sleep 方法 xff08 休眠 xff09 是线程类 xff08 Thread xff09 的静态方法 xff0c 调用此方法会让当前线程暂停执行指定的时间 xff0c 将执行机会 xff08 CPU xff09 让给其他线程 xff0
  • 面试感悟----一名3年工作经验的程序员应该具备的技能

    原文地址http www cnblogs com xrq730 p 5260294 html xff0c 转载请注明出处 xff0c 谢谢 xff01 前言 因为和同事有约定再加上LZ自己也喜欢做完一件事之后进行总结 xff0c 因此有了这
  • c语言菜单经典实例

    include lt conio h gt include lt dos h gt include lt graphics h gt include lt stdio h gt include lt stdlib h gt 定义一些常数 d
  • Mac 必备工具之 brew

    brew 是 Mac 下的一个包管理工具 xff0c 类似于 centos 下的 yum xff0c 可以很方便地进行安装 卸载 更新各种软件包 xff0c 例如 xff1a nodejs elasticsearch kibana mysq
  • ps:图像尺寸

    在课程 01中我们知道了显示器上的图像是由许多点构成的 xff0c 这些点称为像素 xff0c 意思就是 构成图像的元素 但是要明白一点 xff1a 像素作为图像的一种尺寸 xff0c 只存在于电脑中 xff0c 如同RGB色彩模式一样只存
  • WSL+cmder+oh-my-zsh美化win10命令工具(terminal)

    最近在win10下面搭建了一个 WSL 43 cmder 43 oh my zsh 的程序员命令行环境 xff0c 为什么呢 xff1f 还不是买不起mac xff0c 加上自己的黑苹果瘫了 xff0c 所有又回到了win10上面 不过上面
  • 计算机专业总人数所占比例公式,excel统计数据所占比例的教程详解

    Excel中经常需要统计数据所占的比例 xff0c 统计数据所占比例具体该如何操作呢 下面是学习啦小编带来的关于excel统计数据所占比例的方法 xff0c 希望阅读过后对你有所启发 excel统计数据所占比例的方法 统计数据所占比例步骤1
  • Android包管理机制(五)APK是如何被解析的

    本文首发于微信公众号 刘望舒 原文链接 xff1a APK是如何被解析的 xff1f 相关文章 包管理机制系列 前言 在本系列的前面文章中 xff0c 我介绍了PackageInstaller的初始化和安装APK过程 PMS处理APK的安装
  • 银河麒麟系统开机自动运行

    制作了一个deb安装包 xff0c 实现应用软件开机自启动 将Desktop文件放到 etc xdg autostart目录下 xff0c Desktop中Exec指向一个脚本文件 同样的脚本文件桌面菜单和开始菜单点击都是可以执行的 xff
  • SpringMvc+ajax 实现json格式数据传递

    传JSON对象 前端 function test var param 61 username 34 yitop 34 ajax timeout 20000 type 34 POST 34 dataType 34 JSON 34 url 34
  • 教你一招:windows批处理中实现延时的办法

    五种方法可以实现批出里的延时 xff0c 推荐使用方法一 xff0c 该方法也是使用最多的 方法一 用ping命令延迟 这是最简单而且是最常见的 xff1a 64 echo off echo 34 use ping to delay 34
  • 计算机与我的生活英语作文,描写一天的生活英语作文(通用7篇)

    描写一天的生活英语作文 通用7篇 在平凡的学习 工作 生活中 xff0c 大家都不可避免地要接触到作文吧 xff0c 作文要求篇章结构完整 xff0c 一定要避免无结尾作文的出现 相信很多朋友都对写作文感到非常苦恼吧 xff0c 下面是小编
  • Ubuntu通过LDAP集成AD域账号登录(libnss-ldap方式)

    Ubuntu通过LDAP集成AD域账号登录 xff08 libnss ldap方式 xff09 xff1a apt get install libnss ldap xff08 中间直接回车 xff0c 忽略 xff09 vi etc nss
  • 优秀的程序员需要擅长数学吗?

    天有很多年轻人或经验不足的程序员 在 论坛发帖 在 Stack Exchange 网站问 xff1a 为了成为优秀的程序员 xff0c 我需要擅长数学吗 xff1f xff0c 在我还年轻的时候 xff0c 我也问自己同样的问题 最近 xf
  • 阅读作业:大泥球、敏捷、人件

    34 大泥球 34 我了解到的就是这几点 xff1a 第一 xff0c 有很多条件促使大泥球产生 xff0c 包括 34 一次性代码 34 xff0c 时间紧缺 xff0c 急于完成最小集 xff0c 初期尝试 xff0c 功利主义等等 第

随机推荐

  • lubuntu自动登录(lxde)

    lubuntu 是个轻量级的发行版本 xff0c 非常简洁 xff01 值得一试 xff01 好吧 xff0c 上主题 xff0c 设置自动登录 xff08 两步 xff09 xff1a 1 etc lxdm default conf su
  • 常用照片尺寸

    照片规格 英寸 xff08 厘米 xff09 像素 数码相机类型 1寸 2 5 3 5cm 413 295 身份证大头照 3 3 2 2 390 260 2寸 3 5 5 3cm 626 413 小2寸 xff08 护照 xff09 4 8
  • spring boot application.properties 属性详解

    2019年3月21日17 09 59 英文原版 xff1a https docs spring io spring boot docs current reference html common application properties
  • linode中文社区 linodeclub

    Linode Manager管理后台的功能简介 xff01 Linode中文文档 xff08 原创或翻译 xff09 Linode中文社区 Linode讨论 Linode代购 Powered by Discuz 基本操作 Linode Ma
  • 关闭线程池:shutdown()方法与isTerminated()和awaitTermination()配合使用

    今天在项目中使用了线程池 xff0c 发现不会把线程关闭掉 xff0c 所以就看了这方面 xff0c 并作个记录 1 shutdown 和isTerminated 配合使用 目前项目中使用的shutdown 和isTerminated 配合
  • 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念

    本系列所有文章 如何一步一步用DDD设计一个电商网站 xff08 一 xff09 先理解核心概念 如何一步一步用DDD设计一个电商网站 xff08 二 xff09 项目架构 如何一步一步用DDD设计一个电商网站 xff08 三 xff09
  • Linux_note 命令grep,sed,awk

    1 grep 过滤出指定的行 grep cinvABC 39 word 39 filename color 把匹配到的关键词用红色标识 如 xff1a grep color 39 root 39 etc passwd c xff1a 打印符
  • java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 解决方案

    缺少 commons logging jar
  • 辩和辨的区别

    辩 xff1a 用言辞来解释 所以中间是言字旁 辨 xff1a 用眼睛来辨别 所以中间是一只眼睛 xff08 象形字 xff09 辩 xff0c 主要用于说明语言上 xff0c 所以中间有个讠 xff0c 例如辩论 辨 xff0c 主要用于
  • poi workbook转成流

    try ByteArrayOutputStream bos 61 new ByteArrayOutputStream workbook write bos byte barray 61 bos toByteArray InputStream
  • linux下ssh远程登录服务器入门操作

    使用用户名密码登录 在命令行中输入命令 xff1a ssh username 64 ip address p port 之后系统会提示输入密码 xff0c 输入后即可登录 如果不添加 p选项 xff0c 则默认是22端口 还可以使用 l选项
  • Flutter开发遇坑记录

    问题1 Android Studio flutter 项目运行报错 Launching lib main dart on Android SDK built for x86 in debug mode Initializing gradle
  • 深度剖析CMOS、FinFET、SOI和GaN工艺技术

    真空管的发明是电子工业发展的重要动力 但是 xff0c 在第二次世界大战之后 xff0c 由于需要大量的分立元件 xff0c 设备的复杂性和功耗显着增加 xff0c 而设备的性能却不断下降 xff0c 其中一个例子是波音B 29 xff0c
  • 多线激光雷达与单线激光雷达的区别

    多线激光雷达是指同时发射及接收多束激光的激光旋转测距雷达 xff0c 市场上目前有4线 8线 16 线 32 线 64 线和128线之分 xff0c 多线激光雷达可以识别物体的高度信息并获取周围环境的3D扫描图 xff0c 主要应用于无人驾
  • VSCode + PYQT5 + QtDesigner 环境搭建和测试

    目的 xff1a 编写Python桌面应用程序 备注 xff1a 也可以选择VS2017 43 QtDesigner xff0c 但更喜欢VSCode 第1步 xff1a 安装PyQt5和PyQt5 tools pip3 install i
  • JavaScript 事件委托详解

    基本概念 事件委托 xff0c 通俗地来讲 xff0c 就是把一个元素响应事件 xff08 click focus xff09 的函数委托到另一个元素 xff1b 一般来讲 xff0c 会把一个或者一组元素的事件委托到它的父层或者更外层元素
  • Peoplecode Trace in a File

    Local File amp fle amp fle 61 GetFile GetCwd 34 files Test xml 34 34 W 34 FilePath Absolute amp fle WriteLine 34 Hi 34 a
  • 游标的使用之压缩数据库Log文件

    declare 64 databasename nvarchar 100 定义游标以及赋值 获取所有Online的Database Name declare getDataBaseCursor cursor for select name
  • 13-初识指针

    一 函数的实际运行原理 函数在接受参数的时候 会重新开辟内存来进行计算 二 指针 最牛逼 xff1a 汇编语言 xff1a 都是直接操作地址去访问内存单元里面等内容 C语言作为高级语言 xff1a 提供通过地言 xff1a 都是址去访问内存
  • 从n个元素中选择k个的所有组合(包含重复元素)

    LeetCode Combinations这篇博客中给出了不包含重复元素求组合的5种解法 我们在这些解法的基础上修改以支持包含重复元素的情况 对于这种情况 xff0c 首先肯定要对数组排序 xff0c 以下不再强调 修改算法1 xff1a