491.递增子序列
思路:递归+回溯。所有节点都有可能是结果,不用写终止条件。但是要判断每个子序列结果和是否valid。由于横向我们不能取重复的元素,使用set记录已经使用过的元素,竖向是可以使用相同的元素(只要不是重复使用)。
注意:
1.不能排序。排序完的数组就都是自增子序列了。
2.set在回溯的时候不用返回操作,因为每次都会新建一个set(局部变量) 。
46.全排列
思路:used数组记录竖向不能重复使用元素。i = 0开始表示横向可以重复取元素(因为元素所在位置不一样)。每个叶子结点是一个结果,需要终止条件。for循环中递归加回溯。
47.全排列 II
思路:去重,记得要排序。横向和竖向都需要去重!横向去重:数组相邻相等&&used[i - 1]为false;竖向去重:used[i]为true。去重情况continue。
注意:used[i]=true是竖向去重,=false是横向去重,横向去重效率高一点。