这一题使用DFS回溯法,我们先来分析一下这种方法的时间复杂度:
如图。由于我们知道数组的长度不超过15,所以这颗树最坏的情况的啊hi见复杂度为2^15,也就是几十万的计算量,是可以接收的。
那么我们根据思路写出算法:
class Solution {
public List<List<Integer>> findSubsequences(int[] nums) {
Set<List<Integer>> ans = new HashSet<List<Integer>>();
List<Integer> temp = new ArrayList<>();
DFS(ans,temp,0,nums);
List<List<Integer>> list = new ArrayList<>(ans);
return list;
}
public void DFS(Set<List<Integer>> ans,List<Integer> temp,int start,int[] nums){
if (start >= nums.length){
if (temp.size() > 1){
ans.add(temp);
}
return ;
} else {
if (temp.size() == 0){
List<Integer> temp1 = new ArrayList<Integer>();
temp1.add(nums[start]);
start++;
DFS(ans,temp1,start,nums);
DFS(ans,temp,start,nums);
return ;
}
int cmp = temp.get(temp.size() - 1);
//如果当前遍历到的元素>temp中的最后一个元素,那么分有当前元素和眉头当前元素两种情况来讨论
if (nums[start] >= cmp) {
List<Integer> temp1 = new ArrayList<Integer>();
temp1.addAll(temp);
temp1.add(nums[start]);
start++;
DFS(ans,temp1,start,nums);
DFS(ans,temp,start,nums);
} else if (nums[start] < cmp) {//如果当前遍历到的元素<temp中的最后一个元素,那么直接拿向后遍历
start++;
DFS(ans,temp,start,nums);
}
}
}
}