77. Combinations

2023-12-21 15:58
文章标签 77 combinations

本文主要是介绍77. Combinations,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

77. 组合

给定两个整数 nk,返回 1 ... n 中所有可能的 k 个数的组合。

示例:

输入: n = 4, k = 2
输出:
[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],
]

解法一:

//时间复杂度O(n^k), 空间复杂度O(k*C(n,k))
class Solution {
public:void combine(vector<vector<int>>& res, vector<int>& cur, unordered_set<int>& us, int n, int k) {if(cur.size() == k) {res.push_back(cur);return;}for(int i = 1; i <= n; i++) {if(us.count(i) || !cur.empty() && i < cur[cur.size() - 1]) continue;cur.push_back(i);us.insert(i);combine(res, cur, us, n, k);cur.pop_back();us.erase(i);}}vector<vector<int>> combine(int n, int k) {vector<vector<int>> res;vector<int> cur;unordered_set<int> us;combine(res, cur, us, n, k);return res;}
};

解法二:

//时间复杂度O(n!*n), 空间复杂度O(k*C(n,k))
class Solution {
public:vector<vector<int>> combine(int n, int k) {vector<int> nums(n);vector<int> selector(n);for(int i = 0; i < n; i++) {nums[i] = i + 1;if(i < k) selector[i] = 1;else selector[i] = 0;}vector<vector<int>> res;do {vector<int> temp;for(int i = 0; i < n; i++) {if(selector[i] == 1) {temp.push_back(nums[i]);}}res.push_back(temp);} while(prev_permutation(selector.begin(), selector.end()));return res;}
};

解法一与第31、39、40题的思路一样,递归地遍历每一种情况,只取数组元素递增的作为解。每一层有n种情况要遍历,一共有k层,时间复杂度O(n^k)。

解法二是看陈硕的书上给出的解法,先设置一个列表nums = [1,2,3,...,n],再给一个列表selector = [1,1,1,...,0,0,0](有k个1),对selector作全排列,然后以它为蒙板对nums进行过滤(具体说就是当selector[i]==1时,取nums[i]),得到一个子序列,就是组合中一种的情况。这种要对n长的数组作全排列,时间复杂度O(n!*n)

2019/10/23 10:53

这篇关于77. Combinations的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/520602

相关文章

代码随想录算法训练营第十九天| 回溯理论、77. 组合、216. 组合总和Ⅲ、17. 电话号码的字母组合

今日内容 回溯的理论基础leetcode. 77 组合leetcode. 216 组合总和Ⅲleetcode. 17 电话号码的字母组合 回溯理论基础 回溯法也叫回溯搜索法,它是一种搜索的方式,而且只要有递归就会有回溯,回溯就是递归的副产品。 回溯说到底并不是什么非常高深的搜索方式,本质上仍然是穷举,穷举所有可能然后选择出我们要的答案。剪枝会使回溯法更加高效一点,但改变不了回溯本质就是穷举

Day 8:77 组合

77 组合 1. 题目描述2. 解题思路3. 代码实现4. 回溯模板 1. 题目描述 77 组合 2. 解题思路 该题可以使用回溯类型的模板来解决,注意到可以进行剪枝操作。 3. 代码实现 class Solution {vector<vector<int>> res;vector<int> path;public:vector<vector<int>> combine

Linux shell编程学习笔记77:tar命令——快照 备份(下)

0 前言 在 Linux shell编程学习笔记76:tar命令——快照 & 备份(上)-CSDN博客https://blog.csdn.net/Purpleendurer/article/details/141862585?spm=1001.2014.3001.5501 中我们研究了 tar命令 的功能、格式、选项说明。 现在我们来实践一下。 1 应用实例 1.1 创建演示

LeetCode 17 Letter Combinations of a Phone Number

题意: 给出数字串s,输出按照9键键盘输入s时可能的所有字符串。 思路: 没思路……直接模拟过程就得了…… 写switch好看点……吧…… 代码: class Solution {public:vector<string> letterCombinations(string digits) {vector<string> res;if(!digits.size()){

77.给定两个整数 `n` 和 `k`,实现一个算法返回范围 `[1, n]` 中所有可能的 `k` 个数的组合。你可以按任何顺序返回答案

LeetCode 77. 组合详解 一、题目描述 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按任何顺序返回答案。 示例 1: 输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 示例 2: 输入:n = 1, k = 1 输出:[[1]] 提示: 1 <= n

Leetcode 77. 组合 组合型回溯 C++实现

Leetcode 77. 组合 问题:给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。 算法: 创建二维返回数组 ans ,和临时数组 path 。 进入 dfs 函数,d 代表还需要选 d 个数字(用一共要选的数字个数 k  减去  已经选过的数字个数,也就是数组 path 的 size)。当 d==0 时证明选完了,

导入项目启动报错Unexpectedexception parsing XML document from file[H:\software\apache-tomcat-7.0.77\webapps\

导入项目启动报错Unexpectedexception parsing XML document from file[H:\software\apache-tomcat-7.0.77\webapps\ItcastOA\WEB-INF\classes\applicationContext.xml]       背景介绍: 导入项目报错1: ER

AI创业的77个方向

随着AI的发展和不断挖掘能力,很多工作已经可以用AI来代替。这种情况下,用AI来创业成为很多人的选择,那如何选择创业方向呢?文章给了77个建议,可以参考。 AI创业的77个方向© 由 ZAKER科技 提供 人工智能系统可以分析大量数据、识别模式并根据处理的信息做出预测或建议。对于创业来说,人工智能可以在多个方面带来巨大的好处。人工智能有潜力彻底改变创业精神,使初创企业能够在不断变

77. Combinations Question

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],] 给定m k,求出1-n范围内所有

LeetCode:Letter Combinations of a Phone Number

题目链接:https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/ 项目源码:https://github.com/haha174/daylx Given a string containing digits from 2-9 inclusive, return all possible l