返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++如何实现组合项
  • 297
分享到

C++如何实现组合项

2023-06-20 15:06:26 297人浏览 八月长安
摘要

本篇内容主要讲解“c++如何实现组合项”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++如何实现组合项”吧!Combinations 组合项Given two integers n&

本篇内容主要讲解“c++如何实现组合项”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++如何实现组合项”吧!

Combinations 组合项

Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.

For example,
If n = 4 and k = 2, a solution is:

[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]

这道题让求1到n共n个数字里k个数的组合数的所有情况,还是要用深度优先搜索DFS来解,根据以往的经验,像这种要求出所有结果的集合,一般都是用DFS调用递归来解。那么我们建立一个保存最终结果的大集合res,还要定义一个保存每一个组合的小集合out,每次放一个数到out里,如果out里数个数到了k个,则把out保存到最终结果中,否则在下一层中继续调用递归。可写出代码如下:

解法一:

class Solution {public:    vector<vector<int>> combine(int n, int k) {        vector<vector<int>> res;        vector<int> out;        helper(n, k, 1, out, res);        return res;    }    void helper(int n, int k, int level, vector<int>& out, vector<vector<int>>& res) {        if (out.size() == k) {res.push_back(out); return;}        for (int i = level; i <= n; ++i) {            out.push_back(i);            helper(n, k, i + 1, out, res);            out.pop_back();        }    }};

对于n = 5, k = 3, 处理的结果如下:

1 2 3
124
125
134
135
145
234
235
245
345

我们再来看一种递归的写法,此解法没用helper当递归函数,而是把本身就当作了递归函数,写起来十分的简洁,也是非常有趣的一种解法。这个解法用到了一个重要的性质 C(n, k) = C(n-1, k-1) + C(n-1, k),这应该在我们高中时候学排列组合的时候学过吧,博主也记不清了。总之,翻译一下就是,在n个数中取k个数的组合项个数,等于在n-1个数中取k-1个数的组合项个数再加上在n-1个数中取k个数的组合项个数之和。这里博主就不证明了,因为我也不会,就直接举题目中的例子来说明吧:

C(4, 2) = C(3, 1) + C(3, 2)

我们不难写出 C(3, 1) 的所有情况:[1], [2], [3],还有 C(3, 2) 的所有情况:[1, 2], [1, 3], [2, 3]。我们发现二者加起来为6,正好是 C(4, 2) 的个数之和。但是我们仔细看会发现,C(3, 2)的所有情况包含在 C(4, 2) 之中,但是 C(3, 1) 的每种情况只有一个数字,而我们需要的结果k=2,其实很好办,每种情况后面都加上4,于是变成了:[1, 4], [2, 4], [3, 4],加上C(3, 2) 的所有情况:[1, 2], [1, 3], [2, 3],正好就得到了 n=4, k=2 的所有情况了。参见代码如下:

解法二:

class Solution {public:    vector<vector<int>> combine(int n, int k) {        if (k > n || k < 0) return {};        if (k == 0) return {{}};        vector<vector<int>> res = combine(n - 1, k - 1);        for (auto &a : res) a.push_back(n);        for (auto &a : combine(n - 1, k)) res.push_back(a);        return res;    }};

我们再来看一种迭代的写法,也是一种比较巧妙的方法。这里每次先递增最右边的数字,存入结果res中,当右边的数字超过了n,则增加其左边的数字,然后将当前数组赋值为左边的数字,再逐个递增,直到最左边的数字也超过了n,停止循环。对于n=4, k=2时,遍历的顺序如下所示:

0 0 #initialization
1 0
1 1
1 2 #push_back
1 3 #push_back
1 4 #push_back
1 5
2 5
2 2
2 3 #push_back
2 4 #push_back
...
3 4 #push_back
3 5
4 5
4 4
4 5
5 5 #stop 

解法三:

class Solution {public:    vector<vector<int>> combine(int n, int k) {        vector<vector<int>> res;        vector<int> out(k, 0);        int i = 0;        while (i >= 0) {            ++out[i];            if (out[i] > n) --i;            else if (i == k - 1) res.push_back(out);            else {                ++i;                out[i] = out[i - 1];            }        }        return res;    }};

到此,相信大家对“C++如何实现组合项”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: C++如何实现组合项

本文链接: https://lsjlt.com/news/298067.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++如何实现组合项
    本篇内容主要讲解“C++如何实现组合项”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++如何实现组合项”吧!Combinations 组合项Given two integers n&...
    99+
    2023-06-20
  • C++实现LeetCode(77.Combinations 组合项)
    [LeetCode] 77.Combinations 组合项 Given two integers n and k, return all possib...
    99+
    2024-04-02
  • js如何实现数组合并
    这篇文章主要介绍了js如何实现数组合并,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。数组合并使用展开操作符,也可以将多个数组合并起来。感谢你能够认真阅读完这篇文章,希望小编分...
    99+
    2023-06-27
  • java如何实现组合模式
    小编给大家分享一下java如何实现组合模式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!介绍组合模式又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素...
    99+
    2023-05-30
    java
  • C++实现LeetCode(39.组合之和)
    [LeetCode] 39. Combination Sum 组合之和 Given a set of candidate numbers (candidates)...
    99+
    2024-04-02
  • C++实现LeetCode(179.最大组合数)
    [LeetCode] 179. Largest Number 最大组合数 Given a list of non negative integers, arrange them su...
    99+
    2024-04-02
  • vue如何实现选项卡组件
    这篇文章主要为大家展示了“vue如何实现选项卡组件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue如何实现选项卡组件”这篇文章吧。具体内容如下主要功能:点击不同的选项,显示不同的内容html...
    99+
    2023-06-29
  • C#如何实现数组操作
    这篇文章给大家分享的是有关C#如何实现数组操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。数组是相同类型的对象的集合。数组具有相同数据类型的项的有序集合。要访问数组中的某个项,需要同时使用数组名称及该项与数组起...
    99+
    2023-06-17
  • Bootstrap如何实现组合上、下拉框
    这篇文章将为大家详细讲解有关Bootstrap如何实现组合上、下拉框,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下<html> <head&...
    99+
    2024-04-02
  • java如何实现排列组合算法
    这篇文章主要介绍java如何实现排列组合算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!java排列组合算法[@more@]import java.util.ArrayList;import j...
    99+
    2023-06-03
  • 如何在Golang中实现函数组合?
    golang 中实现函数组合,可以通过创建一个高阶函数,接受一个或多个函数作为参数并返回一个函数。例如,我们可以创建一个函数组合 toupperandaddprefix,将字符串转换为大...
    99+
    2024-04-13
    golang 函数组合
  • C++实现LeetCode(40.组合之和之二)
    [LeetCode] 40. Combination Sum II 组合之和之二 Given a collection of candidate numbers (candidate...
    99+
    2024-04-02
  • xmlplus中如何实现选项卡组件
    这篇文章主要介绍了xmlplus中如何实现选项卡组件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。示意图:选项卡组成在具体实现之前,想像一下...
    99+
    2024-04-02
  • C++实现数组中元素组合出最大值
    目录数组中元素组合出最大值如题:这可以算是一个算法类数组或vector求最大值最小值1.求数组的最大值或最小值2.求数组最大值最小值对应的下标数组中元素组合出最大值 如题:这可以算...
    99+
    2024-04-02
  • python如何实现列表组合和列表元素替代组合
    小编给大家分享一下python如何实现列表组合和列表元素替代组合,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!列表组合和列表元素替代组合>>> for ...
    99+
    2024-04-02
  • jQuery如何实现合并/追加数组并去除重复项的方法
    这篇文章主要为大家展示了“jQuery如何实现合并/追加数组并去除重复项的方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jQuery如何实现合并/追加数组并...
    99+
    2024-04-02
  • 如何用Java实现排列组合算法
    目录需求从排列到组合-穷举从排列到组合-分治分治思想代码实现直击本质-位运算思想代码实现小结需求 我们的数据表有多个维度,任意多个维度组合后进行 group by 可能会产生一些”奇...
    99+
    2024-04-02
  • JavaScript如何实现寄生式组合继承
    小编给大家分享一下JavaScript如何实现寄生式组合继承,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!寄生式组合继承的实现?...
    99+
    2024-04-02
  • C语言如何实现数组越界
    这篇文章给大家分享的是有关C语言如何实现数组越界的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。数组越界数组的下标是有范围限制的。数组的下规定是从0开始的,如果数组有n个元素,最后...
    99+
    2024-04-02
  • C++详解如何实现动态数组
    目录动态数组示例代码运行环境运行效果动态数组 动态数组Vector可以动态扩展内存,其采用连续的内存空间,当内存空间不足,便以原来的容量的2倍或者1.5倍成倍的扩展,将原有的数组元素...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作