dfs+回溯写题两种思路

2023-10-10 10:08
文章标签 两种 dfs 思路 回溯 写题

本文主要是介绍dfs+回溯写题两种思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

dfs+回溯写题两种思路

主要框架

	public void dfs(选择列表){//1.找到结束条件//2.遍历所有可能性//2.1做选择//2.2 递归调用自己进一步深度遍历//3.回撤选择
}
  • dfs函数的参数变量我觉得是越少越好,所以将一些不怎么改变的变量设置为全局变量更容易理清思路

1.遍历的过程不停的往中间变量添加数据

剑指 Offer 38. 字符串的排列

	static Set<String> res;static char[] ch;static boolean[] ch_helper;public static String[] permutation(String s) {res = new HashSet<>();ch = s.toCharArray();ch_helper = new boolean[ch.length];dfs("");return res.toArray(new String[res.size()]);}private static void dfs(String str) {//1.结束条件if(str.length() == ch.length){res.add(str);}//2.遍历所有可能性for(int i = 0; i < ch.length; i++){if(ch_helper[i] != true){ch_helper[i] = true;dfs(str + ch[i]);ch_helper[i] = false;}}}

46. 全排列

	static List<List<Integer>> res;static LinkedList<Integer> tmp;public static List<List<Integer>> permute(int[] nums) {res = new LinkedList<>();tmp = new LinkedList<>();dfs(nums);return res;}private static void dfs(int[] nums) {if(tmp.size() == nums.length){res.add(new ArrayList<>(tmp));return;}for(int num : nums){if(tmp.contains(num)){continue;}tmp.add(num);dfs(nums);tmp.removeLast();}

2. 遍历的过程改变原列表,这种一般会从下标0开始

剑指 Offer 38. 字符串的排列

static List<String> res;static char[] ch;public static String[] permutation(String s) {res = new LinkedList<>();ch = s.toCharArray();dfs(0);return res.toArray(new String[res.size()]);}private static void dfs(int i) {//1.结束条件if (i == ch.length - 1){res.add(String.valueOf(ch));return;}//2.选择列表Set<Character> set = new HashSet<>();for(int idx = i; idx < ch.length; idx++){if(set.contains(ch[idx]))continue;set.add(ch[idx]);//2.1选择swap(ch, idx, i);//2.2 进一步dfs(i + 1);//3.回溯swap(ch, idx, i);}}private static void swap(char[] ch, int idx, int i) {char tmp = ch[idx];ch[idx] = ch[i];ch[i] = tmp;}

46. 全排列

  1. 么有剪枝
static List<String> res;static char[] ch;public static String[] permutation(String s) {res = new LinkedList<>();ch = s.toCharArray();dfs(0);return res.toArray(new String[res.size()]);}private static void dfs(int i) {//1.结束条件if (i == ch.length - 1){res.add(String.valueOf(ch));return;}//2.选择列表for(int idx = i; idx < ch.length; idx++){set.add(ch[idx]);//2.1选择swap(ch, idx, i);//2.2 进一步dfs(i + 1);//3.回溯swap(ch, idx, i);}}private static void swap(char[] ch, int idx, int i) {char tmp = ch[idx];ch[idx] = ch[i];ch[i] = tmp;}
  1. 带剪枝
	static List<String> res;static char[] ch;public static String[] permutation(String s) {res = new LinkedList<>();ch = s.toCharArray();dfs(0);return res.toArray(new String[res.size()]);}private static void dfs(int i) {//1.结束条件if (i == ch.length - 1){res.add(String.valueOf(ch));return;}//2.选择列表Set<Character> set = new HashSet<>();for(int idx = i; idx < ch.length; idx++){if(set.contains(ch[idx]))continue;set.add(ch[idx]);//2.1选择swap(ch, idx, i);//2.2 进一步dfs(i + 1);//3.回溯swap(ch, idx, i);}}private static void swap(char[] ch, int idx, int i) {char tmp = ch[idx];ch[idx] = ch[i];ch[i] = tmp;}

这篇关于dfs+回溯写题两种思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/179758

相关文章

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

ural 1149. Sinus Dances dfs

1149. Sinus Dances Time limit: 1.0 second Memory limit: 64 MB Let  An = sin(1–sin(2+sin(3–sin(4+…sin( n))…) Let  Sn = (…( A 1+ n) A 2+ n–1) A 3+…+2) An+1 For given  N print  SN Input One

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

三相直流无刷电机(BLDC)控制算法实现:BLDC有感启动算法思路分析

一枚从事路径规划算法、运动控制算法、BLDC/FOC电机控制算法、工控、物联网工程师,爱吃土豆。如有需要技术交流或者需要方案帮助、需求:以下为联系方式—V 方案1:通过霍尔传感器IO中断触发换相 1.1 整体执行思路 霍尔传感器U、V、W三相通过IO+EXIT中断的方式进行霍尔传感器数据的读取。将IO口配置为上升沿+下降沿中断触发的方式。当霍尔传感器信号发生发生信号的变化就会触发中断在中断

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

深度优先(DFS)和广度优先(BFS)——算法

深度优先 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访

回溯——9.全排列

力扣题目链接 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解题思路 问题建模:题目要求给出一个数组的所有排列组合,属于典型的全排列问题,这可以用回溯法来解决。回溯法通过递归的方式,依次将数组中的每个元素放入排列中,直到生成

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python