栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

77. 组合 | 暴力求解 | 组合 | 暴力递归 | 回溯

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

77. 组合 | 暴力求解 | 组合 | 暴力递归 | 回溯

力扣打卡:77. 组合

解题思路
  • 需要求解所有的可能, 并且没有子问题重复的题目,那么一定是暴力求解,可以考虑回溯
回溯的框架
// 常用的结果储存
List track = new linkedList<>();
List> res = new linkedList<>();

public void backtrack(){ // 先将需要的参数确定下来,然后一边写流程一边考虑是否加参数
    if(终止条件){
        存放结果集,return ;
    }
    for(所有的可能){ // 三步骤 做选择, 去递归, 撤销选择 -- > 做选择 去尝试 再反悔
        1. 做选择
        2. backtrack()
        3. 撤销选择
    }
}
思路
  1. 根据题目的要求可以知道, 有k个数字在组合, 那么也就是说明了终止条件, 存放可能的 track 的 size 只要等于 k,那么久开始存放结果
  2. 因为任意一个元素不是使用任意次,而是只是使用一次
    • for 的遍历所有可能, 应该变为 这个元素后的所有元素 或者 这个元素前的所有元素
  3. 遍历所有的可能的同时, 每次都需要做三个步骤
    • 做选择 (做选择)
    • 去递归 (去尝试)
    • 撤销选择 (再反悔)
代码
class Solution {

    List track = new linkedList<>();
    List> res = new linkedList<>();

    public List> combine(int n, int k) {
        // 所有可能的集合,没有重叠的子问题,暴力求解,也就是回溯
        backtrack(1, n, k);
        return res;
    }
    public void backtrack(int p, int n, int k){
        if(track.size()==k){// 根据题目给定的内容和条件,写出终止条件
            res.add(new linkedList<>(track));
            return ;
        }

        // 暴力穷举出所有的可能
        for(int i=p; i<=n; i++){

            track.add(i); // 做选择
            backtrack(i+1, n, k); // 继续递归
            track.remove(track.size()-1); // 递归之后撤销选择

        }
    }   
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/664567.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号