题目说明
查找给定的一个数组中的所有递增子序列,子序列长度>=2并且可以为本身
解释说明
给定一个数组,查找一个所有递增子序列,可以简化成从数组中找到所有长度为2、3、4......n的递增子序列,而为了从中找到长度为i的递增子序列,我们可以利用深度优先搜索的方式,先将一个数入栈,然后进行向后的深度搜索,找到一个大于等于栈底的元素,就可以再次入栈,再进行深度搜索,直到遍历完整个数组
同时,我们为了高效利用每一个找到的递增子序列,例如长度为2的递增子序列一定包含在长度为3的递增子序列中,所以我们可以直接遍历一遍数组,将其中每次深度优先搜索完后长度大于1的序列保存,这样就可以成功找到所有递增子序列
代码
List<List<Integer>> lists = new LinkedList<>();
public List<List<Integer>> findSubsequences(int[] nums) {
List<Integer> list = new LinkedList<>();
dfs(nums,-1,list);
return lists;
}
private void dfs(int[] nums, int now_local, List<Integer> list) {
if (list.size() > 1) {
lists.add(new LinkedList<>(list));//注意是new一下,因为后面会修改list的内容
}
Set<Integer> visited = new HashSet<>();//保存已经被访问的数组元素
for (int i = now_local + 1; i < nums.length; i++) {
if (visited.contains(nums[i])) {
continue;
}
visited.add(nums[i]);
if (now_local == -1 || nums[i] >= nums[now_local]) {
list.add(nums[i]);
dfs(nums, i, list);
list.remove(list.size() - 1);
}
}
}