简单易懂回溯算法

1、什么是回溯算法算法

回溯算法实际上一个相似枚举的搜索尝试过程,主要是在搜索尝试过程当中寻找问题的解,当发现已不知足求解条件时,就“回溯”返回,尝试别的路径。许多复杂的,规模较大的问题均可以使用回溯法,有“通用解题方法”的美称。编程

回溯算法实际上一个相似枚举的深度优先搜索尝试过程,主要是在搜索尝试过程当中寻找问题的解,当发现已不知足求解条件时,就“回溯”返回(也就是递归返回),尝试别的路径。数组

2、回溯算法思想数据结构

  回溯法通常都用在要给出多个能够实现最终条件的解的最终形式。回溯法要求对解要添加一些约束条件。总的来讲,若是要解决一个回溯法的问题,一般要肯定三个元素:函数

一、选择。对于每一个特定的解,确定是由一步步构建而来的,而每一步怎么构建,确定都是有限个选择,要怎么选择,这个要知道;同时,在编程时候要定下,优先或合法的每一步选择的顺序,通常是经过多个if或者for循环来排列。学习

二、条件。对于每一个特定的解的某一步,他必然要符合某个解要求符合的条件,若是不符合条件,就要回溯,其实回溯也就是递归调用的返回。spa

三、结束。当到达一个特定结束条件时候,就认为这个一步步构建的解是符合要求的解了。把解存下来或者打印出来。对于这一步来讲,有时候也能够另外写一个issolution函数来进行判断。注意,当到达第三步后,有时候还须要构建一个数据结构,把符合要求的解存起来,便于当获得全部解后,把解空间输出来。这个数据结构必须是全局的,做为参数之一传递给递归函数。设计

3、递归函数的参数的选择,要遵循四个原则code

一、必需要有一个临时变量(能够就直接传递一个字面量或者常量进去)传递不完整的解,由于每一步选择后,暂时还没构成完整的解,这个时候这个选择的不完整解,也要想办法传递给递归函数。也就是,把每次递归的不一样状况传递给递归调用的函数。blog

二、能够有一个全局变量,用来存储完整的每一个解,通常是个集合容器(也不必定要有这样一个变量,由于每次符合结束条件,不完整解就是完整解了,直接打印便可)。

三、最重要的一点,必定要在参数设计中,能够获得结束条件。一个选择是能够传递一个量n,也许是数组的长度,也许是数量,等等。

四、要保证递归函数返回后,状态能够恢复到递归前,以此达到真正回溯。

4、学习例题

1.给出 n 表明生成括号的对数,请你写出一个函数,使其可以生成全部可能的而且有效的括号组合。

例如,给出 = 3,生成结果为:

[

  "((()))",

  "(()())",

  "(())()",

  "()(())",

  "()()()"

]

 

2.思路

首先利用回溯枚举出全部括号的可能性,而后进行判断是否符合要求(n对而且是有效的括号组合),就添加到list表格中。

对于递归函数变量须要全局变量列表list:用来存储符合要求的括号组合。

                    局部变量temp:表示当前函数的括号组成样式。

                    计数器x:判断递归次数,限制其底界。

                    总的造成括号对数n。

3.代码(力扣中国第22题)

public List<String> generateParenthesis(int n) {
        List<String> list=new ArrayList<String>();
        add_list(list,"(", 1, n*2);       
        return list;
    }
    
    //书写递归函数
    
    public void add_list(List<String> list,String temp,int x,int n)    
    {
        x++;
        if(x<=n)
        {
          add_list(list,temp+"(",x,n);
          add_list(list,temp+")",x,n);
            
        }
        if(x>n)
        {
            //在这里写判断条件是否负荷有效的括号组合
            char[] k=temp.toCharArray();
            //计数器
            int timer=0;
            for(int i=0;i<k.length;i++)
            {
                if(timer<0||timer>n/2)
                {
                    return;
                }
                else
                {
                    if(k[i]=='(')
                      {
                          timer++;
                      }else
                      {
                          timer--;                          
                      }
                }             
            }
            if(timer==0)
            list.add(temp);
        }
        
    }
相关文章
相关标签/搜索