力扣 全排列

回溯经典例题。

题目

通过回溯生成所有可能的排列。每次递归时,选择一个数字,直到选满所有数字,然后记录当前排列,回到上层时移除最后选的数字并继续选择其他未选的数字。每次递归时,在 path 中添加一个新的数字,直到 path 的长度等于数组 nums 的长度,此时可以将 path 添加到结果集中。当递归深入到某一层时,我们在返回上层前移除 path 中最后添加的数字,恢复现场,尝试其他未选的数字。用循环遍历,然后每次把已加过的数做剔除去选。

记住,dfs递归时会逐层进入,即进入后遇到dfs便会进入下一个dfs,逐渐挖到最深层,然后在出口处加入结果集。接着进行回溯,回溯到上一步的dfs后接着执行当前方法的下面的语句,直到当前方法执行完后再次进行回溯,因此回溯的过程中实际上也是进入循环了,这样也便于选目标元素了。然后递归一定要记得加入的是path副本,回溯时要做好恢复。

java 复制代码
class Solution {
    public List<List<Integer>> permute(int[] nums) {
        LinkedList<List<Integer>> res = new LinkedList<>();            //排列组合结果
        LinkedList<Integer> path = new LinkedList<>();                     //单个排列
        dfs(res,nums,path);
        return res;
    }

    public void dfs(List<List<Integer>> res, int[] nums, LinkedList<Integer> path){
        if(path.size() == nums.length){
            res.add( new ArrayList<Integer>(path) );     //对于每次添加的单个排列,应该都是不同的引用对象
        }
        for(int i=0; i<nums.length; i++){
            if(path.contains(nums[i]))  {continue;}              //当前层中,已添加的数不再考虑  
            path.add(nums[i]);                                   //未添加的数则存放
            dfs(res, nums, path);               //进入下一层(递归)
            path.removeLast();                                  //从深层节点向浅层节点回溯
        }
    }
}
相关推荐
艾莉丝努力练剑2 分钟前
【AI大模型接入SDK】Gemini模型接入知识体系
java·开发语言·网络·人工智能·网络协议·学习·http
一切皆是因缘际会4 分钟前
资源的适配
大数据·人工智能·算法
云运维笔记4 分钟前
Zabbix 分布式监控搭建实战:基于 Proxy 实现 MySQL、Java、Nginx 监控
java·mysql·zabbix
鲸能云7 分钟前
【智慧能源】源储调售一体化架构与 EMS 滚动调度算法实践 —— 工商业光储收益提升 22% 的技术拆解
算法·架构·能源
zhanghaha131411 分钟前
Python进阶教程:28_queue 队列模块 零基础超详细教程
java·开发语言·python
双翌视觉15 分钟前
曝光调不对,算法全白费:机器视觉的曝光三态解析
人工智能·算法·计算机视觉
司小豆15 分钟前
第七课:DeepSeek Harness 服务与依赖注入
java·服务器·开发语言·github·ai编程
ysu_031424 分钟前
02-单链表完全指南
c语言·数据结构·算法·leetcode
生态学者36 分钟前
香港理工大学Nature Communications:沿海塑料际古菌组特征及生态影响
大数据·人工智能·算法·r语言·微信公众平台
ocean210338 分钟前
2025-2026年计算机网络面试高频知识点洞察
计算机网络·面试·职场和发展·https·tcp·面试真题·秋招春招