力扣77. 组合(java 回溯法)

Problem: 77. 组合

文章目录

题目描述

思路

题目要求给出1-n中每k个数一组的所有组合,我们可以利用回溯,将其穷举出来,具体的:

1.以数字1-n为回溯的决策阶段 ,回溯的起始阶段为1

2.回溯函数的结束条件有两个:1.当决策路径 的长度等于k时,将当前的路径添加到结果集合中并返回;2.当决策阶段等于k+1 时返回(因为等于k+1时表示1-k阶段已经穷举 完毕)

3.回溯处理(递归决策树),在每个阶段恢复上一个阶段的状态

解题方法

1.定义二维结果集result

2.调用并编写回溯函数:

2.1当决策路径的长度k时,将当前的路径添加到结果集合中并返回;.当决策阶段等于k+1 时返回

2.2先不添加决策到决策路径的递归 ,再添加决策到决策路径的递归同时还原本决策阶段的决策状态

复杂度

时间复杂度:

O ( C n k ) O(C_n^k) O(Cnk)

空间复杂度:

O ( n + C n k ) O(n + C_n^k) O(n+Cnk)

Code

java 复制代码
class Solution {
    //Save the result
    private List<List<Integer>> result = new ArrayList<>();

    /**
     * Get the combination
     * @param n The range of number(1~n)
     * @param k Specifies how many numbers are in a combination
     * @return List<List<Integer>>
     */
    public List<List<Integer>> combine(int n, int k) {
        backtrack(n, k, 1, new ArrayList<Integer>());
        return result;
    }

    /**
     * Backtracking fetch combination
     * @param n The range of number(1~n)
     * @param k Specifies how many numbers are in a combination
     * @param step Decision stage
     * @param path Decision path
     */
    public void backtrack(int n, int k, int step, List<Integer> path) {
        //End condition
        if (path.size() == k) {
            result.add(new ArrayList<>(path));
            return;
        }
        //End condition
        if (step == n + 1) {
            return;
        }
        backtrack(n, k, step + 1, path);
        path.add(step);
        backtrack(n, k, step + 1, path);
        path.remove(path.size() - 1);
    }
}
相关推荐
帅得不敢出门11 小时前
精简Android SDK(AOSP)的git项目提高git指令速度
android·java·开发语言·git·elasticsearch
liu****11 小时前
10.排序
c语言·开发语言·数据结构·c++·算法·排序算法
青蛙大侠公主11 小时前
Spring事务
java·数据库·spring
小小Fred11 小时前
FreeRTOS函数prvInitialiseNewTask解析
java·开发语言
图表制作解说(目标1000个图表)11 小时前
Java通过BACnet协议读取和写入设备信息
java·楼宇自控·bacnet协议
老华带你飞11 小时前
校务管理|基于springboot 校务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·spring
_OP_CHEN11 小时前
【算法基础篇】(三十二)动态规划之背包问题扩展:从多重到多维,解锁背包问题全场景
c++·算法·蓝桥杯·动态规划·背包问题·算法竞赛·acm/icpc
利刃大大11 小时前
【JavaSE】十一、Stack && Queue && Deque && PriorityQueue && Map && Set
java·数据结构·优先级队列··哈希表·队列·集合类
油丶酸萝卜别吃11 小时前
springboot项目中与接口文档有关的注解
java·spring boot·后端
listhi52011 小时前
机械系统运动学与动力学在MATLAB及SimMechanics中的实现方案
人工智能·算法·matlab