当前位置: 首页 > news >正文

dfs递归回溯的两种体型

1. 全排列,排列型回溯

在这里插入图片描述
个人思路:可以枚举排列中每一个位置pos应该放什么元素,往下dfs就看看下一个位置pos放什么元素。

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> ansList = new ArrayList<>();
        boolean[] vis = new boolean[nums.length];
        dfs(nums, 0, ansList, new ArrayList<>(), vis);
        return ansList;
    }

    public void dfs(int[] nums, int pos, List<List<Integer>> ansList, List<Integer> curList, boolean[] vis) {
        if (pos == nums.length) {
            ansList.add(new ArrayList<>(curList));
            return;
        }

        for (int i = 0; i < nums.length; i++) {
            if (!vis[i]) {
                curList.add(nums[i]);
                vis[i] = true;

                dfs(nums, pos+1, ansList, curList, vis);

                // 恢复现场
                vis[i] = false; 
                curList.remove(curList.size()-1);
            }
        }
    }
}

2. 组合,组合型回溯

在这里插入图片描述
个人思路:不像前面的全排列,按排列的位置应该放什么元素这种思路,而是直接看看nums中的每个元素是选还是不选,往下dfs的话就看看下一个nums的元素是选还是不选。

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> ansList = new ArrayList<>();
        dfs(nums, 0, new ArrayList<>(), ansList);
        return ansList;
    }

    public void dfs(int[] nums, int curI, List<Integer> curList, List<List<Integer>> ansList) {
        // 递归出口
        if (curI >= nums.length) {
            ansList.add(new ArrayList(curList));
            return;
        }

        // 选nums[curI]
        curList.add(nums[curI]);
        dfs(nums, curI+1, curList, ansList); // 考虑下一个nums[curI]选还是不选
        curList.remove(curList.size()-1); // 恢复现场

        // 不选nums[curI]
        dfs(nums, curI+1, curList, ansList); // 考虑下一个nums[curI]选还是不选
    }
}
http://www.dtcms.com/a/110040.html

相关文章:

  • 水下声呐探测仪,应急救援中的高效水下定位技术|深圳鼎跃
  • Nuxt3项目的SEO优化(robots.txt,页面tdk,伪静态.html,sitemap.xml动态生成等)
  • 开源虚拟化管理平台Proxmox VE部署超融合
  • RHCSA LINUX系统文件管理
  • 市场交易策略优化与波动管理
  • 6.模型训练4-毕设篇
  • 【Prometheus】kube-state-metrics 的详细说明
  • 【学习笔记】计算机网络(七)—— 网络安全
  • Metasploit 反弹Shell
  • eplan许可证常见问题及解决方法
  • 数据结构(JAVA)单向,双向链表
  • 解析CSRF攻击
  • Transformer架构详解:从Encoder到Decoder的完整旅程
  • VSCode历史版本的下载安装
  • 破解AI编程瓶颈:上下文管理助力高效开发,以Cline为例
  • kornia,一个实用的 Python 库!
  • 环形链表相关题目
  • ARM架构安装MySQL8.0
  • 数据结构每日一题day11(链表)★★★★★
  • Python HTTP交互双剑客:requests与responses实战指南
  • 2025年消防设施操作员考试题库及答案
  • 矩池云使用指南
  • 高级IO模型
  • 华三H3C模拟器HCL搭建简单内网三层网络
  • Lua:第1-4部分 语言基础
  • Compose组件转换XML布局
  • 煤矿沿线 智能输入输出模块,一般用来干什么
  • 使用 Vue3 打造一个简易分类器演示工具
  • LLM大模型教程——为什么要学习AI大模型
  • 力扣HOT100之矩阵:240. 搜索二维矩阵 II