【算法leetcode每日一练】剑指 Offer II 080. 含有 k 个元素的组合 | 77. 组合
文章目录
- 剑指 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. 组合:
给定两个整数 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 <= 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. 组合相关推荐
- 剑指 Offer II 080. 含有 k 个元素的组合
题目 给定两个整数 n 和 k,返回 1 - n 中所有可能的 k 个数的组合. 示例 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3] ...
- Leetcode刷题笔记——剑指offer II (五)【二分、排序、回溯】
这里写目录标题 二分查找 剑指 Offer II 069. 山峰数组的顶部 剑指 Offer II 070. 排序数组中只出现一次的数字 剑指 Offer II 071. 按权重生成随机数 剑指 Of ...
- Leetcode刷题笔记——剑指offer II (一)【整数、数组、字符串、链表】
目录 整数 剑指 Offer II 001. 整数除法 剑指 Offer II 002. 二进制加法 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数 剑指 Offer II 00 ...
- 剑指 Offer II 017. 含有所有字符的最短字符串
剑指 Offer II 017. 含有所有字符的最短字符串 给定两个字符串 s 和 t .返回 s 中包含 t 的所有字符的最短子字符串.如果 s 中不存在符合条件的子字符串,则返回空字符串 &quo ...
- Leetcode刷题笔记——剑指offer II (六)【图】
文章目录 图 695. 岛屿的最大面积 剑指 Offer II 106. 二分图 (每条边的两个结点都来自不同的集合) 剑指 Offer II 107. 矩阵中的距离 (最短路问题,建图,BFS) 剑 ...
- LeetCode 525 连续数组/剑指 Offer II 011. 0 和 1 个数相同的子数组
题目链接:525. 连续数组 思路:前缀和+哈希表 由于「0 和 1 的数量相同」等价于「1 的数量减去 0 的数量等于 0」,我们可以将数组中的 0 视作 -1,则原问题转换成「求最长的连续子数组, ...
- 剑指Offer II --- 2021/9/2
目录 剑指Offer II 116. 朋友圈 剑指Offer II 098. 路径的数目 剑指Offer II 068. 查找插入位置 剑指Offer II 078. 合并排序链表 剑指Offer I ...
- 力扣OJ 剑指 Offer II
目录 剑指 Offer II 001. 整数除法 剑指 Offer II 002. 二进制加法 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数 剑指 Offer II 004. ...
- leetcode每日一题--前缀树;前缀哈希;深搜;面试题 08.04. 幂集;648. 单词替换面试题 01.09. 字符串轮转;剑指 Offer II 062. 实现前缀树
leetcode每日一题 ps:今天的每日一题没意思,简单的模拟,自己换一道 面试题 08.04. 幂集 幂集.编写一种方法,返回某集合的所有子集.集合中不包含重复的元素. 说明:解集不能包含重复的子 ...
最新文章
- 不能精准定位bug?可能是你没get到这几个打印日志的诀窍!
- 关于java数据库章节connection连接不成功的时候!!!
- Tomcat类加载器机制
- php文件锁 阻塞区别,php文件锁阻塞模式和非阻塞模式
- RN-android 打包后,部分图片不显示
- 是谁在我的心里打了个结(二十一)托付
- 中位数和顺序统计量(第9章)
- activeMQ 的kahadb存储引擎分析
- MySQL-5.6.x二进制版本安装记录
- 升级完ssh之后login incorrect怎么解决_魔兽世界怀旧服:伏击搜索流,盗贼另类升级刷钱方法简单攻略...
- 【NumPy基础】100道numpy练习——Apprentice篇
- 用Jquery写tab插件(支持点击和移动及其他事件)
- OpenCv —— 人脸识别(附完整源码)
- Gartner的企业信息管理EIM模型
- 劳埃镜 matlab,光学习题及答案
- python钉钉机器人定时发送消息服务器_用Python写一个定时提醒的钉钉机器人
- 巧萌易携之ROS2Go的不完全教研攻略
- 数据中心服务器多少度宕机,害怕宕机?来看看数据中心机房的4大等级!
- Android 仿微信语音识别
- Silverlight 4 - MVVM with Commanding and WCF RIA Services
热门文章