首页 > 其他分享 >刷刷刷 Day 24 | 77. 组合

刷刷刷 Day 24 | 77. 组合

时间:2023-01-27 23:44:22浏览次数:59  
标签:24 组合 int res 77 回溯 path Day backtracking

77. 组合

LeetCode题目要求

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例

输入:n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

解题思路

先理解组合,在本题中,取 [1,4] 范围内的两个数,结果 [2,4] 和 [4,2] 是没有区别的。
组合的根本是穷举,而解决组合问题就是回溯法来实现。
解决问题前,牢记回溯模板

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

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

上代码

class Solution {
    private List<List<Integer>> res = null;
    private Deque<Integer> path = null;
    public List<List<Integer>> combine(int n, int k) {
        res = new ArrayList<>();
        path = new LinkedList<>();
        backtracking(n, k, 1);
        return res;
    }

    private void backtracking(int n, int k, int startIndex) {
        // [1, n]  范围内 k 个数的组合,如 k = 2 ,那么 [1,2] 就是一个结果
        
        // 终止条件
        if (path.size() == k) {
            // 存放结果;
            res.add(new ArrayList<>(path));
            return;
        }

        // 从 startIndex 位置开始,穷举组合, i <= n-(k-path()) + 1  进行了剪枝优化
        for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) {
            // 处理节点;
            path.add(i);
            // 递归
            backtracking(n, k, i + 1); 
            // 回溯,撤销处理结果
            path.removeLast();
        }
    }
}
重难点

重点理解回溯方法,记住回溯模板,及剪枝优化

附:学习资料链接

标签:24,组合,int,res,77,回溯,path,Day,backtracking
From: https://www.cnblogs.com/blacksonny/p/17069528.html

相关文章

  • day11-实现Spring底层机制-01
    实现Spring底层机制-01主要实现:初始化IOC容器+依赖注入+BeanPostProcessor机制+AOP前面我们实际上已经使用代码简单实现了:SpringXML注入bean(Spring基本介绍02)Sp......
  • 2469
    给你一个四舍五入到两位小数的非负浮点数 celsius 来表示温度,以 摄氏度(Celsius)为单位。你需要将摄氏度转换为 开氏度(Kelvin)和 华氏度(Fahrenheit),并以数组 ans=[kel......
  • 2413
    给你一个正整数 n ,返回 2 和 n 的最小公倍数(正整数)。输入:n=6输出:6解释:6和2的最小公倍数是6。注意数字会是它自身的倍数。classSolution(object):d......
  • 0124 训练小记
    0124训练小记ARC153FTri-ColoredPaths图上问题感觉我做的不多,也没什么好套的常见套路。所以考虑从特殊情形和边缘情况什么的入手。那么我们考虑环。正难则反,统计不......
  • C++Day13 tinyxml2解析rss文件
    一、任务与思路使用tinyxml解析rss文件,使用std::regex(正则表达式)去除html标签,并生成一个pagelib.txt,格式如下<doc><docid>1</docid><title>...</title><......
  • day63 -- 数据库的查询操作
    数据库查询操作简单查询SELECT*FROMstudent--查询全部学生​--查询指定字段SELECT`studentno`,`studentname`FROMstudent--别名SELECT`studentn......
  • Luogu P8773 [蓝桥杯 2022 省 A] 选数异或
    https://www.luogu.com.cn/problem/P8773因为\(a\texttt{xor}b=c\)则\(a\texttt{xor}c=b\),对于\(a_i\)找到\(a_i\texttt{xor}x\)离其最近的位置,放在ST......
  • PLC笔记 知识点汇总 day1
          blog:师万物 本文是学习内容的简单回顾,希望对大家能有所帮助。 电路直流蓄电池交流单相(两线、三相)、两相、三相(三线、四线、五线)发电机:......
  • 【算法训练营day27】LeetCode39. 组合总和 LeetCode40. 组合总和II LeetCode131. 分割
    LeetCode39.组合总和题目链接:39.组合总和独上高楼,望尽天涯题目不难,注意start_index参数的使用。classSolution{private:vector<vector<int>>result;ve......
  • 《RPC实战与核心原理》学习笔记Day10
    11|负载均衡:节点负载差距这么大,为什么收到的流量还一样?什么是负载均衡?当我们的一个服务节点无法支撑现有的访问量时,我们会部署多个节点,组成一个集群,然后通过负载均衡,......