leetcode-回溯算法总结

版权声明:此文章为许诗宇所写,如需转载,请写下转载文章的地址 https://blog.csdn.net/xushiyu1996818/article/details/84335185

leetcode-17-电话号码的字母组合(letter combination of a phone number)-java

在类中建立一个数字对应字母的map,和对应的结果list
进入combine("",digits)
第一个字符串为当前字符串,后面的为还能加上的数字字符串
每次从数组字符串中取最前一位,得到对应的char数组,将nowStr+对应的数组(用for循环,分别加几次),然后再次combine
如果remain为“”,说明一小次循环完成,将nowstr加入result
可以将hashmap 改为char[][]数组,每个数字的字母放在对应的地方

leetcode-22-括号生成(generate parentheses)-java

nowstr为当前字符串,left为剩下的左括号,right为剩下的右括号
如果right>left说明左边已经有多的( 接下来))或者()都可以,可以加右括号
如果left>0说明left有多的,可以加左括号
如果left=right=0 说明此次结束,加入result

leetcode-46-全排列(permutations)-java

解法1(成功,8ms,较慢)

在类中建立一个result的变量,放置结果
建立permutateRemain函数,变量为上一次的全排列几位的list(now)和还能排的数字的list(remain)
在函数中,
如果remain剩余的量为0,将now加入result
对remain进行遍历,在遍历中
遍历的数字为now
先建立一个对now的copy newlist,将newlist加入now
然后将remain除去now,进行新的permutateRemain,然后在remain重新加入now,结束遍历

解法2(别人的)

省去了不断copy list的时间,加了判断now有无这个num的时间

解法3,解法4

字典序 的非递归全排列

递归的交换全排列

http://www.cnblogs.com/pmars/archive/2013/12/04/3458289.html

https://segmentfault.com/a/1190000007067885

leetcode-78-子集(subsets)-java

解法1(别人的)

不错的方法

https://blog.csdn.net/wodedipang_/article/details/52996928

使用位操作,不使用递归。首先,计算一下该数组nums一共有多少个子集,设数组nums的长度为n,那么它的子集总数为num=2^n。
设置一个变量index,其初始值为1。那么从0到2^n-1中数,对于每一个数i,用index(从1到10,100,100(2进制))与这个i进行与操作,如果得出的结果大于0,则把该数输入到List<>中取,比较n次,因为数组的长度为n。

解法2(别人的)

回溯算法

这道题需要求给定数组的子集,特别要求有:
1、必须是升序
2、不能出现重复的

所以做法其实也就是,首先排序,然后回溯。。和昨天那题一样,可以回去看一下。记得选择下一个的时候,别和当前的值重复就可以了。

解法3(别人的)

回溯算法|递归实现

本解法采用回溯算法实现,回溯算法的基本形式是“递归+循环”,正因为循环中嵌套着递归,递归中包含循环,这才使得回溯比一般的递归和单纯的循环更难理解,其实我们熟悉了它的基本形式,就会觉得这样的算法难度也不是很大。原数组中的每个元素有两种状态:存在和不存在。

① 外层循环逐一往中间集合 temp 中加入元素 nums[i],使这个元素处于存在状态

② 开始递归,递归中携带加入新元素的 temp,并且下一次循环的起始是 i 元素的下一个,因而递归中更新 i 值为 i + 1

③ 将这个从中间集合 temp 中移除,使该元素处于不存在状态

解法4(别人的)

组合|非递归实现

这种方法是一种组合的方式

① 最外层循环逐一从 nums 数组中取出每个元素 num

② 内层循环从原来的结果集中取出每个中间结果集,并向每个中间结果集中添加该 num 元素

③往每个中间结果集中加入 num

④将新的中间结果集加入结果集中

leetcode-79-单词搜索(word search)-java

解法1(成功,15ms,很快)

使用回溯算法,对board中每个与word首字母相同的字符ij,开启begin函数
begin中
如果result已经为true,不再继续
如果char[i][j]与word首字母不同,不再继续
如果相同,
如果word长度为1,说明已经到最后一步,result=true
否则,char[i][j]='*',因为让接下来的操作不到这一位
然后newWord=word截去首位的字符串
然后根据i,j的位置,对上下左右进行begin
最后char[i][j]=now,恢复
别人的解法有的把char[i][j]='*',换成一个boolean二维数组,记录跑过的地方

猜你喜欢

转载自blog.csdn.net/xushiyu1996818/article/details/84335185