
LintCode,回溯法
leagalhigh
never give up!
展开
-
数字组合
这次用到的算法是著名的回溯法,八皇后问题的解决就靠的是这种方法,这种函数传入的参数一定有引用,还有上下联系的传递信息,比如这里的curSum,当前总数,当然还有一些参数是一直不变的,比如target。该函数的过程就是首先一开始一定要有递归结束的条件判断,然后调用自己,从小到大开始,增加栈帧,直到退出调用;然后开始从大数到小数递归推进,遇到合适的insert进set中,超出的就停止调用,回退到原原创 2017-01-14 17:04:17 · 260 阅读 · 0 评论 -
组合-lintcode
这是回溯类型的简单题。 分析: - 函数一定要传一个引用类型的vector,以便以后可以往里加数据。其他参数包括n,k,temp(这个就不可以是引用了),还有最重要的一个i,这个函数栈里应该从哪取。 - 函数里首先应该判断return的条件,即result.size()==k或者temp的最后一个元素达到最大n时return。接下来是for循环,每次重新分配一个temp2,然后往里加i,再调用原创 2017-01-16 20:31:27 · 303 阅读 · 0 评论 -
数字组合II-lintcode
还是回溯的问题。 思路:这里应该先对num排序,排序sort()中是迭代器的范围,然后应该排除重复的组合,所以调用的时候要传入setprocess(num, result, item, target, sum, i+1);item.push_back(num[i]);process(num, result,item, target, sum+num[i], i+1);这三行第一行表示不取,原创 2017-01-16 21:53:16 · 462 阅读 · 0 评论 -
恢复IP地址-lintcode
回溯问题。 这道题的重点在于退出递归的条件,有:扫描的迭代器大于字符串长度;递归次数大于3;开头是0并且后面还有数字;截取的字符串数字大于255.然后如果满足这些条件,就要判断是否要添加”.”或者是否次数等于3,把它push进result中。 最后,要按照之选一个数字,选两个数字,选三个数字的递归方式找全所有种可能(毕竟如果找4个数字的话,它肯定大于255了)。 C++代码:clas原创 2017-01-21 13:55:03 · 1233 阅读 · 0 评论 -
生成括号-lintcode
回溯法: 解题思想:这里的关键点是要搞清楚函数的参数应该传什么,这里应该传的是最后结果,要插入的字符串,左括号的个数,右括号的个数和括号对总数n。有了这样的参数,函数处理起来就方便多了,代码也清晰。不满足递归的条件:左括号数或者右括号大于n或者左括号右括号顺序相反;插入res的条件:左右括号数都等于n;最后递归的代码含义是选择左括号或者选择右括号。C++代码:class Solution原创 2017-01-21 21:15:37 · 1664 阅读 · 0 评论 -
分割回文串
这道题考的还是回溯和递归。思路是这样的,process函数中传入res结果,temp(string的vector)和s(string)。它完成的功能是这样的:如果s为空字符串,则把说明已经找完一个回文串的分割,将这个temp放进res中后返回;否则,就将从s的0到i位开始迭代,看看是否s.substr(0,i)是回文串,如果是的话,就将它放进temp中,然后将从s的第i位开始继续调用此函数,直到s原创 2017-01-22 23:39:07 · 247 阅读 · 0 评论 -
电话号码的字母组合
递归这里就是先构造一个数字到字符串的字典map,然后函数中传入引用res(结果),引用dic(字典),数字字符串,合成的字符串。在process函数里,首先判断返回条件,然后递归调用。C++代码:class Solution {public: /** * @param digits A digital string * @return all posible le原创 2017-01-24 22:17:29 · 765 阅读 · 0 评论 -
单词搜索
深度优先搜索,回溯法。这种问题就是在函数的开头判断结束和下面的处理函数时要特别注意。还有就是在需要访问过与否的信息时,需要额外的空间,传递的是引用,改为访问过之后还有改为未访问过;这里有一个小技巧可以避免空间的使用,就是存储访问过的变化,改完之后还要改回来。C++代码:class Solution {public: /** * @param board: A list of原创 2017-01-29 21:45:06 · 405 阅读 · 0 评论