目录
回溯法又称为试探法,但当探索到某一步时,发现原先选择达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。
求子集(Medium)
LeetCode 78.Subsets
已知一组数(其中无重复元素),求这组数可以组成的所有子集。结果中不可有无重复的子集。
例如:nums=[] = [1,2,3]
结果为: [[],[1],[1,2],[1,2,3],[1,3],[2],[2,3],[3]]
Solve1:回溯法
总体思路
用回溯法来解此题,借用的就是回溯遍历的思想,应知如果把此题的遍历过程拆分成一步一步的可描述的步骤,那么最关键的就是如何进行选择放入还是不放入了。如下面的分析,当一个元素选择放入到集合中去,还是不放入到集合中去,所得到的了结果是不一样的。
细节设计
这里对应的第一次递归调用和第二次递归调用,就是对应的一个元素是放入到当前集合中去(item.push_back()之后再执行递归),还是不放入到当前集合中去的情况(item.pop_back()之后再执行递归)。
Solve2:位运算法
预备知识
“&”运算,(二进制下)位元素都为1,结果为1,如果不同时为1,结果为0。
总体思路
细节设计
求子集Ⅱ
已知一组数(其中有重复元素),求这组数可以组成的所有子集。
结果中无重复的子集。
例如:nums[]=[2,1,2,2]
结果:[[],[1],[1,2],[1,2,2],[1,2,2,2],[2],[2,2],[2,2,2]]
注意:[2,1,2]与[1,2,2]是重合的集合!
总体思路
就是在计算之前先进行去重操作!
细节设计
需要用到STL中的set集合了就!
组合数之和Ⅱ(Medium)
LeetCode 40 Combination SumⅡ
已知一组数(其中有重复元素),求这组数可以组成的所有子集中,子集中的各个元素和为整数target的子集,结果中无重复的子集。
例如: nums[]=[10,1,2,7,6,1,5], target=8
结果为:[[1,7],[1,2,5],[2,6],[1,1,6]]
总体思路
细节设计
生成括号(Medium)
LeetCode 22. Generate Parentheses
已知n组括号,开发一个程序,生成这n组括号所有的合法的组合可能。
例如:n=3
结果为:["((()))","((),())","(()),()","(),(())","()()()"]
预备知识:递归生成所有可能
总体思路
细节设计
N皇后(Hard)
LeetCode 51 N-Queens
N皇后问题是计算机科学中最为经典的问题之一,该问题可追溯到1848年,由国际西洋棋棋手马克斯·贝瑟尔于提出了8皇后问题。
将N个皇后摆放在N*N的棋盘中,互相不可攻击,有多少种摆放方式,每种摆放方式具体是怎样的?
预备知识:皇后的攻击范围
总体思路
先以4皇后问题为例进行探讨:
细节设计
逆序数(Hard)
LeetCode 315. Count of Smaller Numbers After Self
已知数组nums,求新数组count,count[i]代表了在nums[i]右侧且比nums[i]的元素个数。
例如:
nums=[5,2,6,1],count=[2,1,1,0];
nums=[6,6,6,1,1,1],count=[3,3,3,0,0,0];
nums=[5,-7,9,1,3,5,-2,1],count=[5,0,5,1,2,2,0,0];