题目:

给定两个整数 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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/combinations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

参考:代码随想录视频 & 代码随想录题解

回溯(递归) + 剪枝  注意:有回溯就会有递归

回溯可以想象成一棵树,集合的大小代表数的深度,递归的深度代表数的深度。

回溯三步曲:

1.确定回溯函数的参数及返回值

参数根据具体问题来补充,返回值一般为void

void backtracking(参数)

2.确定终止条件,终止条件一般都是找到叶子结点(具体问题具体分析)

if (终止条件){
存放结果
return;
}

3.遍历过程--单层递归逻辑

for (本层集合中的元素){  //横向遍历
处理当前结点;
backtracking(路径,选择列表); //纵向遍历
回溯,撤销; }

n相当于树的宽度,K相当于树的深度

思路:

1.定义两个全局遍历,一个temp用来存放符合条件的单一结果,一个result用来存放符合条件结果集合

2.递归的参数,一个为n,一个为k,还有一个startIndex代表下一层递归搜素的起始位置,为了防止取到重复组合

3.递归内部结构:

①temp这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合,用result把temp保存起来,并终止本层递归。

②for循环用来横向遍历树(集合元素),for循环每次从startIndex开始遍历,然后用path保存取到的节点i,再使用backtracking()进行递归下一层,最后再进行回溯的操作,撤销本次处理的结果。

剪枝优化:i <= n - (k - temp.size()) + 1

看上图当n = 4, k=3 时,起始位置最多只能取到2,才能满足后续有三个数字。取3,4后都不能满足我们需要的三位数取也没有意义了。

过程:

优化过程如下:

①已经选择的元素个数:temp.size();

②还需要的元素个数为: k - temp.size();

③在集合n中至多要从该起始位置 : n - (k - temp.size()) + 1,开始遍历

加1的意义:当n = 4, k=3 时,加入temp.size() = 0时,最多只能取到2,4 -(3-0)+1 =2,从1-2开始搜索都可以,超过2就不行了,不满足三个元素了。

代码:

 1 class Solution {
2 List<List<Integer>> result = new ArrayList<>();
3 List<Integer> temp = new ArrayList<>();
4 public List<List<Integer>> combine(int n, int k) {
5 int startIndex = 1;
6 backatring(n, k, startIndex);
7 return result;
8 }
9 public void backatring(int n, int k, int startIndex){
10 if (temp.size() == k){
11 result.add(new ArrayList<>(temp));
12 return;
13 }
14 for (int i = startIndex; i <= n - (k - temp.size()) + 1; i++){
15 temp.add(i);
16 backatring(n, k, i+1);
17 temp.remove(temp.size() - 1);
18 }
19 }
20 }

力扣77(Java)-组合(中等)的更多相关文章

  1. 力扣1438. 绝对差不超过限制的最长连续子数组-C语言实现-中等难度

    题目 传送门 文本 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条 ...

  2. 力扣算法经典第一题——两数之和(Java两种方式实现)

    一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...

  3. 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题

    题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...

  4. 力扣1052. 爱生气的书店老板-C语言实现-中等难度

    题目 传送门 文本 今天,书店老板有一家店打算试营业 customers.length 分钟.每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开. 在某些时 ...

  5. 力扣算法——135Candy【H】

    老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果.相邻的孩子中,评分高 ...

  6. 【力扣leetcode】-787. K站中转内最便宜的航班

    题目描述: 有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 p ...

  7. 刷题-力扣-518. 零钱兑换 II

    518. 零钱兑换 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/coin-change-2/ 著作权归领扣网络所有.商业转载 ...

  8. 力扣算法题—069x的平方根

    实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...

  9. JS数据结构第六篇 --- 二叉树力扣练习题

    1.第226题:翻转二叉树 递归+迭代两种实现方式: /** 反转二叉树 * Definition for a binary tree node. * function TreeNode(val) { ...

  10. 力扣(LeetCode)删除排序链表中的重复元素II 个人题解

    给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...

随机推荐

  1. vue入门教程之-属性、事件和双向绑定

    vue入门教程之-属性.事件和双向绑定 欢迎关注博主公众号「java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 免费领取全网最热的Java架构师学习PDF, 转载请注明出处 htt ...

  2. 不想dto套dto可以这样写

    之前都是要新建个dto文件的,偶然看到别人这样写,简单记录一下 @Data public class GdtDailyBalanceContent { List<GdtDailyBalanceR ...

  3. 洞元智维产品上线:江浙沪PV访问量飙升背后的深层逻辑与未来发展趋势

    洞元智维产品自上线以来,凭借其卓越的智能化产品性能和出色的用户体验,迅速在市场上崭露头角,特别是在上海.江苏.浙江等经济发达地区,其PV访问量持续飙升.这不仅反映了用户对智能化产品的强烈需求,更揭示了 ...

  4. 【福利】JetBrains 全家桶永久免费使用

    Jetbrains系列的IDE公认是最好的集成开发工具,但是收费且挺贵.我们以PhpStorm为例,新用户第一年需要199$,注意是$,还不是人民币,这个价格一上来肯定筛选掉一大批用户.确实好用,所以 ...

  5. 记录--9个封装Vue组件的小技巧

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 组件是前端框架的基本构建块.把它们设计得更好会使我们的应用程序更容易改变和理解.在这节课中,分享一下在过去几年中工作中学到的 9 个技巧. ...

  6. dynatrace监控发现Java代码中new对象耗时100多秒

    排查代码发现两个原因: 1.流,之前用的字节流,通过打日志发现并发场景有效率问题,改为了字符流: 2.用的jaxb转换xml,也是在并发时效率急剧下降,发现在每次转换时都在创建新对象,修改为只有第一次 ...

  7. 马文·柯林斯的教育之道 「Marva Collins' Way」 阅读笔记

    <马文·柯林斯的教育之道> 是 哈佛幸福课(积极心理学) 中强列推荐的一本书 这本书主写的是 马文·柯林斯 的成长经历已经和教育理念,仅看介绍,会误认为这本书只是在说鼓励式的教学理念,看完 ...

  8. d3d12龙书阅读----绘制几何体(上)

    d3d12龙书阅读----绘制几何体(上) 本节主要介绍了构建一个简单的彩色立方体所需流程与重要的api 下面主要结合立方体代码分析本节相关知识 顶点 输入装配器阶段的输入 首先,我们需要定义立方体的 ...

  9. modelsim的工程文件结构

    modelsim的工程文件结构 1.工程结构 modelsim中的工程包括一个库(这个库可以是空的,也可以包含器件延时信息的真实库),一个工程(以mpf为后缀的文件是工程的快捷打开方式)和若干源文件. ...

  10. java使用ftp连接linux处理文件

    1.Maven依赖 <!-- FTP使用包 --> <dependency> <groupId>commons-net</groupId> <ar ...