子集问题
本题相对于简单的子集问题,又多了去重这一部分,就很想当然的想到了40. 组合总和 II,基本上的思路是一致的,但是因为是要求递增子序列,所以对于原数组,我们是不能重新排序的。所以逻辑判断上会有些复杂
代码
class Solution { List<List<Integer>> res = new ArrayList<>(); LinkedList<Integer> path = new LinkedList<>(); public List<List<Integer>> findSubsequences(int[] nums) { backtracking(nums, 0); return res; } public void backtracking(int[] nums,int startIndex) { //递归边界,可以不写return;因为到叶子节点后就不会进循环,会自动结束递归。 if (path.size() > 1) { res.add(new LinkedList<>(path)); } boolean[] used = new boolean[201];//用used数组进行去重 for (int i = startIndex; i < nums.length; i++) { if (!path.isEmpty() && nums[i] < path.get(path.size() - 1) || (used[nums[i] + 100] )) continue; used[nums[i]+100] = true;//因为used数组是在每一次递归都会重新定义,所以不用回溯。 path.add(nums[i]); backtracking(nums, i+1); path.removeLast(); } } }