leetcode第491题递增子序列
第一版的错误代码:
思路:
- 子集的去重+特殊条件(路径的长度>2 并且 当前值要大于 路径的最后一个值)
这个思路看起来没什么错的,绝大部分的测试用例也过的去,一起来分析一种,1,2,3,1,1,第一个1在回溯的过程中,会合后面的两个1,一一进行匹配,当我们回溯到第二个1的时候,3的used数组已经变为了false,nums【i - 1】 != nums【i】,也会进行匹配,子集中的去重是排序之后的,数字之间是连续的,不会和现在一样,1 和 1 之间还有比1大的数字
class Solution {
List<List<Integer>> res;
public List<List<Integer>> findSubsequences(int[] nums) {
res = new LinkedList<>();
if(nums.length == 0){
return res;
}
boolean[] used = new boolean[nums.length];
for(int i = 0;i < used.length;i++){
used[i] = false;
}
LinkedList<Integer> path = new LinkedList<Integer>();
backTrack(nums,used,0,path);
return res;
}
public void backTrack(int[] nums,boolean[] used,int startIndex,LinkedList<Integer> path){
if(path.size() >= 2){
res.add(new LinkedList<>( path));
}
for(int i = startIndex;i < nums.length;i++){
if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false){
continue;
}
if(path.size() > 0 && nums[i] < path.peekLast()){
continue;
}
if(!used[i]){
path.add(nums[i]);
used[i] = true;
backTrack(nums,used,i + 1,path);
if(!path.isEmpty()){
used[i] = false;
path.removeLast();
}
}
}
}
}
思路:
用了一个HashSet去重,防止【1,1】这种现象重复发生。继续优化可以变为int数组。
class Solution {
List<List<Integer>> res;
public List<List<Integer>> findSubsequences(int[] nums) {
//这种方式没办法进行排序还是需要另外找方式
res = new LinkedList<>();
if(nums.length == 0){
return res;
}
LinkedList<Integer> path = new LinkedList<Integer>();
backTrack(nums,0,path);
return res;
}
public void backTrack(int[] nums,int startIndex,LinkedList<Integer> path){
if(path.size() >= 2){
res.add(new LinkedList<>( path));
}
int[] used = new int[201];
for(int i = startIndex;i < nums.length;i++){
if(!path.isEmpty() && nums[i] < path.peekLast() || used[nums[i] + 100] == 1){
continue;
}
used[nums[i] + 100] = 1;
path.add(nums[i]);
backTrack(nums,i + 1,path);
path.removeLast();
}
}
}