给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。
示例:
输入: [4, 6, 7, 7]
输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]
说明:
给定数组的长度不会超过15。
数组中的整数范围是 [-100,100]。
给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。
思路:开一个map存储所以子序列是否出现过,另一个map用来存以第i个数字结尾的所有列表,然后遍历一遍就o了。
class Solution {
public List<List<Integer>> findSubsequences(int[] nums) {
StringBuilder str=new StringBuilder();
List<Integer> list=new ArrayList<>();
List<Integer> list1=new ArrayList<>();
Map<String,Boolean> map1=new HashMap<>();
Map<Integer,List<List<Integer>>> map=new HashMap<>();
List<List<Integer>> ans=new ArrayList<>();
for(int i=0;i<nums.length;i++) {
map.put(i, new ArrayList<>());
list.clear();
list.add(nums[i]);
map.get(i).add(new ArrayList<>(list));
for(int j=0;j<i;j++) {
if(nums[i]<nums[j])
continue;
for(int k=0;k<map.get(j).size();k++) {
list1.clear();
list1.addAll(map.get(j).get(k));
list1.add(nums[i]);
str.delete(0, str.length());
for(int h=0;h<list1.size();h++) {
str.append(String.valueOf(list1.get(h)));
str.append('-');
}
if(map1.containsKey(str.toString())) continue;
else
map1.put(str.toString(), true);
ans.add(new ArrayList<>(list1));
map.get(i).add(new ArrayList<>(list1));
}
}
}
//System.out.println(ans.size());
return ans;
}
}