文章目录

  • 剑指 Offer II 080. 含有 k 个元素的组合 | 77. 组合:
  • 样例 1:
  • 样例 2:
  • 提示:
  • 分析
  • 题解
    • java
    • c
    • c++
    • python
    • go
    • rust
    • javascript
    • typescript
  • 原题传送门:https://leetcode-cn.com/problems/uUsW3B/
  • 原题传送门:https://leetcode-cn.com/problems/combinations/

剑指 Offer II 080. 含有 k 个元素的组合 | 77. 组合:

给定两个整数 nk,返回 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 <= 20
  • 1 <= k <= n

分析

  • 面对这道算法题目,二当家的陷入了沉思。
  • 穷举所有组合,使用递归大法是最直观的。
  • 每个数字都可以选择或者不选择。
  • 由于是组合不是排列,所以我们可以从小到大取数,那第一位取数范围就是从1到n+1-k,第二位就是从2到n+2-k,第三位就是从3到n+3-k…

题解

java

class Solution {public List<List<Integer>> combine(int n, int k) {List<List<Integer>> ans = new ArrayList<>();this.dfs(ans, new Integer[k], 0, 1, n, k);return ans;}/**** @param ans 最终结果* @param row 行记录* @param rowSize 行数字数量* @param s 开始数字* @param n* @param k*/private void dfs(List<List<Integer>> ans, Integer[] row, int rowSize, int s, int n, int k) {if (rowSize == k) {ans.add(Arrays.asList(Arrays.copyOf(row, row.length)));return;}for (int num = s; num <= n + 1 - (k - rowSize); ++num) {// 选择当前数字row[rowSize] = num;dfs(ans, row, rowSize + 1, num + 1, n, k);}}
}

c

/***** @param ans 最终结果* @param returnSize 结果行数量* @param row 行记录* @param rowSize 行数字数量* @param s 开始数字* @param n * @param k*/
void dfs(int **ans, int *returnSize, int *row, int rowSize, int s, int n, int k)
{if (rowSize == k){int *tmp = malloc(sizeof(int) * k);for (int i = 0; i < k; i++){tmp[i] = row[i];}ans[(*returnSize)++] = tmp;return;}for (int num = s; num <= n + 1 - (k - rowSize); ++num) {// 选择当前数字row[rowSize] = num;dfs(ans, returnSize, row, rowSize + 1, num + 1, n, k);}
}int a(int n, int m)
{int c = 1;while (m > 0){c *= n--;m--;}return c;
}/*** 计算返回数量** @param n* @param k* @return int*/
int calcReturnSize(int n, int k)
{k = fmin(k, n - k);return a(n, k) / a(k, k);
}/*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/
int **combine(int n, int k, int *returnSize, int **returnColumnSizes)
{int **ans = malloc(calcReturnSize(n, k) * sizeof(int *));int row[k];*returnSize = 0;dfs(ans, returnSize, row, 0, 1, n, k);*returnColumnSizes = malloc(*returnSize * sizeof(int));for (int i = 0; i < (*returnSize); ++i){(*returnColumnSizes)[i] = k;}return ans;
}

c++

class Solution {private:/**** @param ans 最终结果* @param row 行记录* @param s 开始数字* @param n* @param k*/void dfs(vector<vector<int>> &ans, vector<int> &row, int s, int n, int k){if (row.size() == k){ans.push_back(row);return;}for (int num = s; num <= n + 1 - (k - row.size()); ++num){// 选择当前数字row.push_back(num);dfs(ans, row, num + 1, n, k);row.pop_back();}}
public:vector<vector<int>> combine(int n, int k){vector<vector<int>> ans;vector<int> row;dfs(ans, row, 1, n, k);return ans;}
};

python

class Solution:def combine(self, n: int, k: int) -> List[List[int]]:def dfs(s):if len(row) == k:ans.append(row[:])returnfor num in range(s, n + 2 - (k - len(row))):# 选择当前数字row.append(num)dfs(num+1)row.pop()ans = []row = []dfs(1)return ans

go

func combine(n int, k int) (ans [][]int) {var dfs func([]int, int, int)dfs = func(row []int, rowSize int, s int) {if rowSize == k {ans = append(ans, append([]int{}, row...))return}for num := s; num <= n+1-(k-rowSize); num++ {// 选择当前数字row[rowSize] = numdfs(row, rowSize+1, num+1)}}dfs(make([]int, k), 0, 1)return
}

rust

impl Solution {pub fn combine(n: i32, k: i32) -> Vec<Vec<i32>> {fn dfs(ans: &mut Vec<Vec<i32>>, row: &mut Vec<i32>, rowSize: i32, s: i32, n: i32, k: i32) {if rowSize == k {ans.push(row.to_vec());return;}(s..n + 2 - (k - rowSize)).for_each(|num| {// 选择当前数字row[rowSize as usize] = num;dfs(ans, row, rowSize + 1, num + 1, n, k);});}let mut ans = Vec::new();dfs(&mut ans, &mut vec![0; k as usize], 0, 1, n, k);ans}
}

javascript

/*** @param {number} n* @param {number} k* @return {number[][]}*/
var combine = function(n, k) {const dfs = (row, rowSize, s) => {if (rowSize === k) {ans.push([...row]);return;}for (let num = s; num <= n + 1 - (k - rowSize); ++num) {// 选择当前数字row[rowSize] = num;dfs(row, rowSize + 1, num + 1);}}const ans = [];dfs([], 0, 1);return ans;
};

typescript

function combine(n: number, k: number): number[][] {function dfs(row: number[], rowSize : number, s: number) {if (rowSize === k) {ans.push([...row]);return;}for (let num = s; num <= n + 1 - (k - rowSize); ++num) {// 选择当前数字row[rowSize] = num;dfs(row, rowSize + 1, num + 1);}}const ans = [];dfs([], 0, 1);return ans;
};


原题传送门:https://leetcode-cn.com/problems/uUsW3B/

原题传送门:https://leetcode-cn.com/problems/combinations/


非常感谢你阅读本文~
欢迎【

【算法leetcode每日一练】剑指 Offer II 080. 含有 k 个元素的组合 | 77. 组合相关推荐

  1. 剑指 Offer II 080. 含有 k 个元素的组合

    题目 给定两个整数 n 和 k,返回 1 - n 中所有可能的 k 个数的组合. 示例 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3] ...

  2. Leetcode刷题笔记——剑指offer II (五)【二分、排序、回溯】

    这里写目录标题 二分查找 剑指 Offer II 069. 山峰数组的顶部 剑指 Offer II 070. 排序数组中只出现一次的数字 剑指 Offer II 071. 按权重生成随机数 剑指 Of ...

  3. Leetcode刷题笔记——剑指offer II (一)【整数、数组、字符串、链表】

    目录 整数 剑指 Offer II 001. 整数除法 剑指 Offer II 002. 二进制加法 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数 剑指 Offer II 00 ...

  4. 剑指 Offer II 017. 含有所有字符的最短字符串

    剑指 Offer II 017. 含有所有字符的最短字符串 给定两个字符串 s 和 t .返回 s 中包含 t 的所有字符的最短子字符串.如果 s 中不存在符合条件的子字符串,则返回空字符串 &quo ...

  5. Leetcode刷题笔记——剑指offer II (六)【图】

    文章目录 图 695. 岛屿的最大面积 剑指 Offer II 106. 二分图 (每条边的两个结点都来自不同的集合) 剑指 Offer II 107. 矩阵中的距离 (最短路问题,建图,BFS) 剑 ...

  6. LeetCode 525 连续数组/剑指 Offer II 011. 0 和 1 个数相同的子数组

    题目链接:525. 连续数组 思路:前缀和+哈希表 由于「0 和 1 的数量相同」等价于「1 的数量减去 0 的数量等于 0」,我们可以将数组中的 0 视作 -1,则原问题转换成「求最长的连续子数组, ...

  7. 剑指Offer II --- 2021/9/2

    目录 剑指Offer II 116. 朋友圈 剑指Offer II 098. 路径的数目 剑指Offer II 068. 查找插入位置 剑指Offer II 078. 合并排序链表 剑指Offer I ...

  8. 力扣OJ 剑指 Offer II

    目录 剑指 Offer II 001. 整数除法 剑指 Offer II 002. 二进制加法 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数 剑指 Offer II 004. ...

  9. leetcode每日一题--前缀树;前缀哈希;深搜;面试题 08.04. 幂集;648. 单词替换面试题 01.09. 字符串轮转;剑指 Offer II 062. 实现前缀树

    leetcode每日一题 ps:今天的每日一题没意思,简单的模拟,自己换一道 面试题 08.04. 幂集 幂集.编写一种方法,返回某集合的所有子集.集合中不包含重复的元素. 说明:解集不能包含重复的子 ...

最新文章

  1. 不能精准定位bug?可能是你没get到这几个打印日志的诀窍!
  2. 关于java数据库章节connection连接不成功的时候!!!
  3. Tomcat类加载器机制
  4. php文件锁 阻塞区别,php文件锁阻塞模式和非阻塞模式
  5. RN-android 打包后,部分图片不显示
  6. 是谁在我的心里打了个结(二十一)托付
  7. 中位数和顺序统计量(第9章)
  8. activeMQ 的kahadb存储引擎分析
  9. MySQL-5.6.x二进制版本安装记录
  10. 升级完ssh之后login incorrect怎么解决_魔兽世界怀旧服:伏击搜索流,盗贼另类升级刷钱方法简单攻略...
  11. 【NumPy基础】100道numpy练习——Apprentice篇
  12. 用Jquery写tab插件(支持点击和移动及其他事件)
  13. OpenCv —— 人脸识别(附完整源码)
  14. Gartner的企业信息管理EIM模型
  15. 劳埃镜 matlab,光学习题及答案
  16. python钉钉机器人定时发送消息服务器_用Python写一个定时提醒的钉钉机器人
  17. 巧萌易携之ROS2Go的不完全教研攻略
  18. 数据中心服务器多少度宕机,害怕宕机?来看看数据中心机房的4大等级!
  19. Android 仿微信语音识别
  20. Silverlight 4 - MVVM with Commanding and WCF RIA Services

热门文章

  1. Unity_MegaFiers_Morph O Matic
  2. 手机号码归属地查询 - 一刀工具
  3. 关于PO自动生成AP发票
  4. 去除谷歌地图api上的各种默认标记
  5. 毕业辨答 24PPPT模板
  6. 放个N老的程序,留着以后看
  7. Sharding-JDBC概述
  8. 基于微信小程序的学生选课系统源码
  9. index.dat结构分析
  10. 5个能让你15T硬盘立马爆满的黑科技网站,让你在工作中技高一筹