天寒宜早睡,梦醒闻雪声,倒计时83

永远别高估自己的自制力啊,疲软期明显比我预料的来得早的多。

 今天刷了一张回溯算法的小卡片,过程磕磕绊绊,似懂非懂。

1.Leetcode 电话号码的字母组合

回溯算法一般过程是多写一个回溯的方法,然后在主方法中加条件判断,记录当前状态,进入回溯方法,退出后再回到回溯前的状态。

本题先创建一个静态字符数组,存放按键上的字符串,同时初始化一个stringbuffer对象,用于存放每一个子字符串。

边界条件是层次n等于输入“23”的长度时,将生成的串塞进list,然后回溯。

2.Leetcode 生成括号

回溯方法中加两个参数 left right = 括号数,保证left<=right, 当他俩都为0时 存储生成的字符串 并回溯。

3.Leetcode 全排列

4.Leetcode 子集

5.单词搜索

 

 

回溯算法和递归的差别 

https://blog.csdn.net/u014772862/article/details/51789015

回溯的概念:

从问题的某一种可能出发, 搜索从这种情况出发所能达到的所有可能, 当这一条路走到” 尽头 “的时候, 再倒回出发点, 从另一个可能出发, 继续搜索. 这种不断” 回溯 “寻找解的方法, 称作” 回溯法 “。

回溯是一种试探,类似穷举,但是有剪枝功能(加if判断就行)。

递归:

为了描述问题的某一状态,必须用到该状态的上一状态,而描述上一状态,又必须用到上一状态的上一状态……这种用自已来定义自己的方法,称为递归定义。   

绕一点讲,递归是一种算法结构,而回溯是一种算法思想,可以用递归实现。

 

递归的本质

其实递归的本质就是找到前后的联系,找到递归的公式

例如    F(n) = F(n-1) + F(n-2) 等等

 递归的一般情况是

(1). if(满足递归结束条件),返回值

(2). else,继续递归

回溯的本质,其实是在递归基础上进行了改进

(1). if(不满足继续递归查找的条件,通常是界限判断),返回

(2). if(满足查找条件),记录下来,继续往下

(3). 加入这个节点,更新条件和值

(4). 递归左边

(5).递归右边

(6). 删除这个节点(回溯)

 

 

明后天滑雪,要断更两天,希望回来还能好好继续吧。。

是一定要继续啊TT

posted @ 2018-12-07 21:50  马叉虫啊  阅读(119)  评论(0)    收藏  举报