Given an integer array, your task is to find all the different possible increasing subsequences of the given array, and the length of an increasing subsequence should be at least 2 .

Example:

1
2
Input: [4, 6, 7, 7]
Output: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]

Note:

  1. The length of the given array will not exceed 15.

  2. The range of integer in the given array is [-100,100].

  3. The given array may contain duplicates, and two equal integers should also be considered as a special case of increasing sequence.

思路

第一次用Java写DFS,就总结一下自己在写Java的时候踩到的坑吧。

首先在Java里面,所有的对象/变量都要实例化。所以在利用stats这个变量的时候,我们要在Solution类的构造函数里面把stats这个变量给实例化,这样我们才能在函数里面调用,不然就会有null-pointer exception。当然,我们也可以不在构造函数里面将stats变量实例化。我们将stats作为DFS函数的参数,在findSubsequences函数将stats变量实例化,也会得到一样的效果。

必须要注意,每次进行DFS的时候,都需要实例化一个新的存储空间。(当然,在C++里面如果要分配内存空间,记得每次都要释放掉)否则,不同函数的进行DFS的结果,就会在同一块区域里面不断堆叠,得不到我们想要的结果。

List, Set这些类,都是super interface/abstract interface ,它们本身不能被实例化。但是hashset,arraylist这些类分别是Set和List类的子类,它们都可以被实例化。

对于这道题,在做DFS的时候,思路其实很简单。我们将所给出的数组进行暴力搜索,然后在结果的基础上进行剪枝,如果有一个元素使得子数组递减,就舍去这个继续搜索的过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class Solution {
private Set<List<Integer>> stats;
public Solution()
{
stats = new HashSet<List<Integer>>();
}
private void DFS(int[] nums, int target, List<Integer> result){
if(target == 0){
stats.add(result);
}
else{
for (int i = 0; i < nums.length; i++){
if( ( (!result.isEmpty()) && nums[i] >= result.get(result.size() - 1) ) || ( result.isEmpty() ) )
{
List<Integer> new_result = new ArrayList<Integer>(result);
new_result.add(nums[i]);
int len = nums.length - 1 - i;
if (len >= target - 1){
int[] new_nums = new int[len];
int k = 0;
for (int j = i + 1; j < nums.length; j++){
new_nums[k] = nums[j];
k++;
}
int t = target - 1;
DFS(new_nums, t, new_result);
}
}
}
}
}
public List<List<Integer>> findSubsequences(int[] nums) {
for (int i = 2; i <= nums.length; i++){
List<Integer> result = new ArrayList<Integer>();
DFS(nums, i, result);
}
List<List<Integer>> ans = new ArrayList<List<Integer>>(stats);
return ans;
}
}