代码随想录算法训练营之JAVA|第二十一天| 77. 组合

今天是第21天刷leetcode,立个flag,打卡60天。

算法挑战链接

77. 组合https://leetcode.cn/problems/combinations/description/

第一想法

需要从N个数中选取K个数,那么第一想法肯定是k个for循环,每个for循环选取一个数,比如从4个数中选取两个数,代码如下

java 复制代码
for (int i = 1; i <= 4; i++) {

    for (int j = i + 1; j <= 4; j++) {
        //i 和 j 就是想要得到的两个数
    }
}

但是现在的问题是K是不确定的,也就是我需要在代码中写出K的for循环。

直接写感觉是写不出来的,递归是一个好办法。

于是递归三要素就上阵了

  • 返回值和参数 返回一个列表, 参数: n, k, index, 列表
  • 结束递归的条件。 列表为null 或者 列表的size == k
  • 本层要完成的事情。 for循环index之后的数,并且添加到列表中,进入下一个递归

代码写出来之后会有一个很严重的问题,那就是列表会保留上一次结果添加的数。

看完代码随想录之后的想法

回溯也是递归的一种。但是回溯是比较特殊的一种,关于回溯的介绍在这里:回溯的介绍

学习完成回溯之后,我们可以得出回溯的模版

java 复制代码
void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

于是我们按照模版来写出了下面的代码

java 复制代码
class Solution {
    LinkedList<Integer> result = new LinkedList<>();
    List<List<Integer>> results = new ArrayList<>();
    public List<List<Integer>> combine(int n, int k) {
        backtracking(n, k, 1);
        return results;
    }

    void backtracking(int n, int k,int index){
        if (result.size() == k) {
            results.add(new ArrayList<>(result));
            return;
        }

        for (int i = index; i <= n; i++){
            result.add(i);
            backtracking(n, k, i+1);
            result.removeLast();
        }

    }
}

实现过程中遇到哪些困难

理解回溯是一件很困难的事情,主要困难的点在于回溯的思想是将解题过程看成是一颗树,穷举了所有的解体过程,然后先横向遍历,在纵向遍历,获取到每一种解题的可能。

今日收获

理解了回溯算法,并且拿到了回溯算法的模版

相关推荐
菜鸟江多多3 分钟前
32x32热成像高斯滤波图像处理
图像处理·单片机·算法
秋野酱4 分钟前
基于SpringBoot酒店管理系统设计和实现(源码+文档+部署讲解)
java·spring boot·后端
阳洞洞13 分钟前
二叉树的层序遍历
数据结构·算法·leetcode·二叉树遍历·广度优先搜索
今天也要早睡早起14 分钟前
代码随想录算法训练营Day32| 完全背包问题(二维数组 & 滚动数组)、LeetCode 518 零钱兑换 II、377 组合总数 IV、爬楼梯(进阶)
数据结构·c++·算法·leetcode·动态规划·完全背包
在下木子生17 分钟前
mac如何将jar包上传到maven中央仓库中
java·macos·maven·jar
字节旅行者29 分钟前
C++中如何使用STL中的list定义一个双向链表,并且实现增、删、改、查操作
开发语言·数据结构·c++·链表
搞程序的心海31 分钟前
用Scala玩转Flink:从零构建实时处理系统
开发语言·flink·scala
写代码的小王吧35 分钟前
【网络安全】 防火墙技术
java·python·安全·web安全·网络安全·docker
XiaoLeisj36 分钟前
【MyBatis】深入解析 MyBatis:关于注解和 XML 的 MyBatis 开发方案下字段名不一致的的查询映射解决方案
xml·java·spring boot·spring·java-ee·tomcat·mybatis
x66ccff40 分钟前
[特殊字符] Pandas 常用操作对比:Python 运算符 vs Pandas 函数
开发语言·python·pandas